2016-04-06 130 views
3
的参数

我进入MVVM和偶然调用这个MWE所示OnPropertyChanged函数的两个版本:OnPropertyChanged INotifyPropertyChanged的

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版本,反之亦然?

回答

5

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

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

所以在你的情况下,这两个调用将导致完全相同的PropertyChanged调用。

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

+0

我接受你的回答,因为我不知道你在[CallerMemberName]中做了哪些解释:) –

+0

在这里需要:) 请记住[CallerMemberName]属性仅适用于此,因为字符串输入是可选的('string propertyName = null') –

5

如果该属性的值在未调用setter的情况下发生更改(作为其他操作的副作用)并且您想要通知该属性,则该属性非常有用。在这种情况下,隐式CallerMemberName将不会提供正确的属性名称。

这主要是出现,如果你有一个只得到属性,做一些内部状态的转换,以提供反馈。每次内部状态发生变化时,都会通知只能获取属性(可能)已更改。就我个人而言,我试图避免这种模式,因为稍后您更改代码时很容易忘记通知。