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 属性(可能)发生了变化。我个人尽量避免这种模式,因为稍后更改代码时很容易忘记通知。
我正在进入 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 属性(可能)发生了变化。我个人尽量避免这种模式,因为稍后更改代码时很容易忘记通知。