實現 INotifyPropertyChanged

INotifyPropertyChanged 是繫結源(即 DataContext)使用的介面,以使使用者介面或其他元件知道屬性已更改。WPF 會在看到 PropertyChanged 事件時自動為你更新 UI。希望在所有檢視模型都可以繼承的基類上實現此介面。

在 C#6 中,這就是你所需要的:

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged([CallerMemberName] string name = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

這允許你以兩種不同的方式呼叫 NotifyPropertyChanged

  1. NotifyPropertyChanged(),它將為呼叫它的 setter 引發事件,這要歸功於 CallerMemberName 屬性。
  2. NotifyPropertyChanged(nameof(SomeOtherProperty)),它將為 SomeOtherProperty 舉起活動。

對於使用 C#5.0 的 .NET 4.5 及更高版本,可以使用它:

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged([CallerMemberName] string name = null)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

在 4.5 之前的 .NET 版本中,你必須將屬性名稱解析為字串常量或使用表示式的解決方案

注意: 可以繫結到沒有實現 INotifyPropertyChanged 的“普通舊 C#物件”(POCO)的屬性,並觀察繫結比預期更好地工作。這是 .NET 中的一個隱藏功能,應該可以避免。特別是當繫結的 Mode 不是 OneTime 時會導致記憶體洩漏(見這裡 )。

為什麼繫結更新沒有實現 INotifyPropertyChanged?