INotifyPropertyChanged 的​​ OnPropertyChanged 参数

OnPropertyChanged parameter of INotifyPropertyChanged

我正在进入 MVVM 并偶然发现了调用此 MWE 中显示的 OnPropertyChanged 函数的两个版本:

public class SampleModel : INotifyPropertyChanged
{
    private string _name;

    public string Name
    {
        get { return _name; }
        set
        {
            if (value == _name) return;
            _name = value;
            // Version 1
            OnPropertyChanged();
            // Version 2
            OnPropertyChanged(nameof(Name));
        }
    }

    #region INotifyPropertyChanged members
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}

为什么我会选择版本 1 而不是版本 2,反之亦然?

由于 [CallerMemberName] 属性,OnPropertyChanged(); 调用将自动获取调用它的班级成员的名称。

OnPropertyChanged(nameof(Name)); 显式将 属性 名称作为输入参数发送到该方法。

因此在您的情况下,这两个调用将导致完全相同的 PropertyChanged 调用。

但是,如果您在方法或类似内容中更改 _name 并希望通知订阅者,则显式调用很有用。

版本 2(具有明确的 属性 名称)在 属性 的值在未调用 setter 的情况下更改(作为其他操作的副作用)时很有用,并且你想通知那个。在这种情况下,隐式 CallerMemberName 将不会提供正确的 属性 名称。

这主要出现在你有一个 get-only 属性 对内部状态进行某种转换以提供反馈的情况下。每次内部状态发生变化时,您都会通知 get-only 属性(可能)发生了变化。我个人尽量避免这种模式,因为稍后更改代码时很容易忘记通知。