Chr*_*vic 3 c# wpf mvvm inotifypropertychanged
我进入MVVM并偶然发现调用OnPropertyChanged此MWE中显示的函数的两个版本:
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
}
Run Code Online (Sandbox Code Playgroud)
为什么我会选择版本1而不是版本2,反之亦然?
该OnPropertyChanged();呼叫将自动获得调用它,由于该classmember的名称[CallerMemberName]属性.
在OnPropertyChanged(nameof(Name));明确将属性名称作为输入参数的方法.
因此,在您的情况下,两次调用将导致完全相同的PropertyChanged调用.
但是,如果您更改_name某个方法或类似的内容,并希望通知订阅者,则显式调用很有用.
如果属性的值更改而不调用setter(作为某些其他操作的副作用)并且您想要通知它,则版本2(具有显式属性名称)非常有用.在这种情况下,隐式CallerMemberName不会提供正确的属性名称.
如果你有一个get-only属性来对内部状态进行某种转换以提供反馈,那么这主要是出现.每次内部状态更改时,您都会通知get-only属性(可能)已更改.我个人试图避免这种模式,因为当你稍后更改代码时很容易忘记通知.
| 归档时间: |
|
| 查看次数: |
479 次 |
| 最近记录: |