INOTifyPropertyChanged的OnPropertyChanged参数

时间:2016-04-06 18:08:00

标签: c# wpf mvvm 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,反之亦然?

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:5)

如果属性的值在不调用setter的情况下发生更改(作为某些其他操作的副作用)并且您想要通知它,那么

版本2(具有显式属性名称)非常有用。在这种情况下,隐式CallerMemberName将不提供正确的属性名称。

如果你有一个get-only属性来对内部状态进行某种转换以提供反馈,那么这主要是出现。每次内部状态更改时,您都会通知get-only属性(可能)已更改。我个人试图避免这种模式,因为当你稍后更改代码时很容易忘记通知。