.NET WinForms INotifyPropertyChanged aktualisiert alle Bindungen, wenn man sich verändert. Der bessere Weg?

In einer windows forms-Anwendung, eine Eigenschaft zu ändern, löst die INotifyPropertyChanged, wird das Ergebnis in form der Lektüre JEDE Immobilie, die von meiner gebundenes Objekt, nicht nur die Eigenschaft verändert. (Siehe Beispiel-code unten)

Scheint dies absurd verschwenderisch, da die Schnittstelle erfordert den Namen der Eigenschaft ändern. Es verursacht eine Menge von Taktung in meiner app, weil einige der property get-Berechnungen erfordern, um durchgeführt werden.

Ich werde wahrscheinlich benötigen, um zu implementieren eine Art von Logik in meinem Getter um die unnötige verwerfen liest, wenn es keinen besseren Weg, dies zu tun.

Bin ich etwas fehlt? Gibt es einen besseren Weg? Sagen Sie nicht, verwenden Sie eine andere Präsentationstechnik bitte -- ich mache das auf Windows Mobile (obwohl das Verhalten geschieht auf der kompletten framework).

Hier ein paar Spielzeug-code um das problem zu demonstrieren. Ein Klick auf die Schaltfläche Ergebnis in BEIDE Textfelder werden gefüllt-auch wenn eine Eigenschaft geändert hat.

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace Example
{
public class ExView : Form
{
    private Presenter _presenter = new Presenter();
    public ExView()
    {
        this.MinimizeBox = false;

        TextBox txt1 = new TextBox();
        txt1.Parent = this;
        txt1.Location = new Point(1, 1);
        txt1.Width = this.ClientSize.Width - 10;
        txt1.DataBindings.Add("Text", _presenter, "SomeText1");

        TextBox txt2 = new TextBox();
        txt2.Parent = this;
        txt2.Location = new Point(1, 40);
        txt2.Width = this.ClientSize.Width - 10;
        txt2.DataBindings.Add("Text", _presenter, "SomeText2");

        Button but = new Button();
        but.Parent = this;
        but.Location = new Point(1, 80);
        but.Click +=new EventHandler(but_Click);
    }

    void but_Click(object sender, EventArgs e)
    {
        _presenter.SomeText1 = "some text 1";
    }
}

public class Presenter : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;

    private string _SomeText1 = string.Empty;
    public string SomeText1
    {
        get
        {
            return _SomeText1;
        }
        set
        {
            _SomeText1 = value;
            _SomeText2 = value; //<-- To demonstrate that both properties are read
            OnPropertyChanged("SomeText1");
        }
    }

    private string _SomeText2 = string.Empty;
    public string SomeText2
    {
        get
        {
            return _SomeText2;
        }
        set
        {
            _SomeText2 = value;
            OnPropertyChanged("SomeText2");
        }
    }

    private void OnPropertyChanged(string PropertyName)
    {
        PropertyChangedEventHandler temp = PropertyChanged;
        if (temp != null)
        {
            temp(this, new PropertyChangedEventArgs(PropertyName));
        }
    }
}

}

InformationsquelleAutor der Frage Dave Welling | 2010-05-12

Schreibe einen Kommentar