Heim >Backend-Entwicklung >C++ >Wie löst man Ereignisse für Eigenschaftswertänderungen in C# aus?

Wie löst man Ereignisse für Eigenschaftswertänderungen in C# aus?

Barbara Streisand
Barbara StreisandOriginal
2024-12-28 13:57:09345Durchsuche

How to Raise Events for Property Value Changes in C#?

Ereignisse für Immobilienwertänderungen auslösen

Bei der Arbeit mit Eigenschaften müssen Sie möglicherweise immer dann ein Ereignis auslösen, wenn sich der Wert der Eigenschaft ändert.

Frage:

Es gibt eine Eigenschaft mit dem Namen ImageFullPath1, das erfordert, dass ein Ereignis ausgelöst wird, wenn sich sein Wert ändert. Trotz der Existenz von INotifyPropertyChanged besteht die Anforderung darin, die Lösung mithilfe von Ereignissen zu implementieren.

Antwort:

Die INotifyPropertyChanged-Schnittstelle basiert tatsächlich auf Ereignissen. Es gibt ein einziges Mitglied, PropertyChanged, ein Ereignis, das Verbrauchern das Abonnieren ermöglicht.

Die von Richard vorgeschlagene Lösung ist jedoch nicht zuverlässig. Eine sicherere Implementierung ist:

public class MyClass : INotifyPropertyChanged
{
    private string imageFullPath;

    protected void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, e);
    }

    protected void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

    public string ImageFullPath
    {
        get { return imageFullPath; }
        set
        {
            if (value != imageFullPath)
            {
                imageFullPath = value;
                OnPropertyChanged("ImageFullPath");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Merkmale dieser Implementierung:

  • Methoden zur Benachrichtigung über Eigenschaftsänderungen sind abstrahiert, was eine einfache Anwendung auf andere Eigenschaften ermöglicht.
  • Der PropertyChanged-Delegat wird kopiert, bevor er aufgerufen wird, um Race-Bedingungen zu vermeiden.
  • Er wird korrekt implementiert die INotifyPropertyChanged-Schnittstelle.

Zusätzliche eigenschaftsspezifische Ereignisse:

Wenn Sie auch ein Ereignis für Änderungen in einer bestimmten Eigenschaft erstellen möchten, z. B. ImageFullPath, Sie können hinzufügen:

protected void OnImageFullPathChanged(EventArgs e)
{
    EventHandler handler = ImageFullPathChanged;
    if (handler != null)
        handler(this, e);
}

public event EventHandler ImageFullPathChanged;

Anrufen OnImageFullPathChanged(EventArgs.Empty) nach OnPropertyChanged("ImageFullPath").

CallerMemberAttribute in .Net 4.5:

In .Net 4.5 und höher ermöglicht Ihnen das CallerMemberAttribute Folgendes Entfernen Sie den hartcodierten Eigenschaftsnamen in der Quelle Code:

protected void OnPropertyChanged(
    [System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
{
    OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}

public string ImageFullPath
{
    get { return imageFullPath; }
    set
    {
        if (value != imageFullPath)
        {
            imageFullPath = value;
            OnPropertyChanged();
        }
    }
}

Das obige ist der detaillierte Inhalt vonWie löst man Ereignisse für Eigenschaftswertänderungen in C# aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn