Suche…


Bemerkungen

Die Schnittstelle INotifyPropertyChanged wird immer dann benötigt, wenn Ihre Klasse die Änderungen an ihren Eigenschaften melden soll. Die Schnittstelle definiert ein einzelnes Ereignis PropertyChanged .

Mit XAML Binding wird das PropertyChanged Ereignis automatisch verbunden, sodass Sie nur die INotifyPropertyChanged-Schnittstelle in Ihrem Ansichtsmodell oder in den Datenkontextklassen implementieren müssen, um mit XAML Binding arbeiten zu können.

Implementieren von INotifyPropertyChanged in C # 6

Die Implementierung von INotifyPropertyChange kann fehleranfällig sein, da für die Schnittstelle der Eigenschaftsname als String angegeben werden muss. Um die Implementierung robuster zu gestalten, kann ein Attribut CallerMemberName verwendet werden.

class C : INotifyPropertyChanged
{
    // backing field
    int offset;
    // property
    public int Offset
    {
        get
        {
            return offset;
        }
        set
        {
            if (offset == value)
                return;
            offset = value;
            RaisePropertyChanged();
        }
    }

    // helper method for raising PropertyChanged event
    void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    // interface implemetation
    public event PropertyChangedEventHandler PropertyChanged;
}

Wenn Sie über mehrere Klassen INotifyPropertyChanged , die INotifyPropertyChanged implementieren, kann es hilfreich sein, die Schnittstellenimplementierung und die INotifyPropertyChanged auf die allgemeine Basisklasse INotifyPropertyChanged :

class NotifyPropertyChangedImpl : INotifyPropertyChanged
{
    protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    // interface implemetation
    public event PropertyChangedEventHandler PropertyChanged;
}

class C : NotifyPropertyChangedImpl
{
    int offset;
    public int Offset
    {
        get { return offset; }
        set { if (offset != value) { offset = value; RaisePropertyChanged(); } }
    }
}

INotifyPropertyChanged mit der Methode "Generic Set"

Die NotifyPropertyChangedBase Klasse definiert eine generische Set-Methode, die von einem beliebigen abgeleiteten Typ aufgerufen werden kann.

public class NotifyPropertyChangedBase : INotifyPropertyChanged
{
    protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    
    public event PropertyChangedEventHandler PropertyChanged;

    public virtual bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
    {
        if (Equals(field, value))
            return false;
        storage = value;
        RaisePropertyChanged(propertyName);
        return true;
    }
}

Um diese generische Set-Methode verwenden zu können, müssen Sie einfach eine Klasse erstellen, die von NotifyPropertyChangedBase abgeleitet ist.

public class SomeViewModel : NotifyPropertyChangedBase
{
    private string _foo;
    private int _bar;

    public string Foo
    {
        get { return _foo; }
        set { Set(ref _foo, value); }
    }

    public int Bar
    {
        get { return _bar; }
        set { Set(ref _bar, value); }
    }
}

Wie oben gezeigt, können Sie Set(ref _fieldName, value); im Setter einer Eigenschaft, und es wird automatisch ein PropertyChanged-Ereignis ausgelöst, wenn es erforderlich ist.

Sie können sich dann beim PropertyChanged-Ereignis von einer anderen Klasse registrieren, die Eigenschaftsänderungen behandeln muss.

public class SomeListener
{
    public SomeListener()
    {
        _vm = new SomeViewModel();
        _vm.PropertyChanged += OnViewModelPropertyChanged;
    }

    private void OnViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        Console.WriteLine($"Property {e.PropertyName} was changed.");
    }

    private readonly SomeViewModel _vm;

}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow