实现 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?