【问题标题】:OnPropertyChanged parameter of INotifyPropertyChangedINotifyPropertyChanged 的​​ OnPropertyChanged 参数
【发布时间】:2016-04-06 18:08:00
【问题描述】:

我进入 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,反之亦然?

【问题讨论】:

    标签: c# wpf mvvm inotifypropertychanged


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我接受你的回答,因为我不知道[CallerMemberName] 做了什么你也解释了:)
    • 这里需要 :) 请记住 [CallerMemberName] 属性仅在此处有效,因为字符串输入是可选的 (string propertyName = null)
    【解决方案2】:

    如果属性的值在没有调用 setter 的情况下发生更改(作为其他操作的副作用)并且您想要通知这一点,则版本 2(具有显式属性名称)很有用。在这种情况下,隐式 CallerMemberName 不会提供正确的属性名称。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      相关资源
      最近更新 更多