INotifyChangedProperty 动态实现
INotifyChangedProperty dynamic implementation
在大多数 tuts 中,他们说要这样写方法:
private void OnPropertyChanged(string prop)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
并称它为 OnPropertyChanged("PropName");
。但这似乎是非常静态的,无法自动重构。有没有办法更动态地做到这一点?我考虑过使用 System.Diagnostic.StackTrace
class 来获取 属性 的名称,但它看起来很丑而且效率不高,而且我无法访问它,例如 Windows Phone 8 个应用程序(为什么!?)。
Caliburn.micro 有一个 PropertyChangeBase
允许您使用 lambda。您可以从它继承并调用基本方法。对于 属性 Name
你可以这样做:
NotifyOfPropertyChange(() => Name);
使用 C# 6.0,您可以实现自己的基础 class 并使用 nameof
运算符,这将有助于重构:
OnPropertyChanged(nameof(Name));
如果您使用的是 .NET Framework 4.5,则可以使用 [CallerMemberName]
因此您的代码将是:
using System.Runtime.CompilerServices;
class BetterClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
// Check the attribute in the following line :
private void FirePropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
private int sampleIntField;
public int SampleIntProperty
{
get { return sampleIntField; }
set
{
if (value != sampleIntField)
{
sampleIntField = value;
// no "magic string" in the following line :
FirePropertyChanged();
}
}
}
}
如问题中所述INotifyPropertyChanged : is [CallerMemberName] slow compared to alternatives?
在大多数 tuts 中,他们说要这样写方法:
private void OnPropertyChanged(string prop)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
并称它为 OnPropertyChanged("PropName");
。但这似乎是非常静态的,无法自动重构。有没有办法更动态地做到这一点?我考虑过使用 System.Diagnostic.StackTrace
class 来获取 属性 的名称,但它看起来很丑而且效率不高,而且我无法访问它,例如 Windows Phone 8 个应用程序(为什么!?)。
Caliburn.micro 有一个 PropertyChangeBase
允许您使用 lambda。您可以从它继承并调用基本方法。对于 属性 Name
你可以这样做:
NotifyOfPropertyChange(() => Name);
使用 C# 6.0,您可以实现自己的基础 class 并使用 nameof
运算符,这将有助于重构:
OnPropertyChanged(nameof(Name));
如果您使用的是 .NET Framework 4.5,则可以使用 [CallerMemberName]
因此您的代码将是:
using System.Runtime.CompilerServices;
class BetterClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
// Check the attribute in the following line :
private void FirePropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
private int sampleIntField;
public int SampleIntProperty
{
get { return sampleIntField; }
set
{
if (value != sampleIntField)
{
sampleIntField = value;
// no "magic string" in the following line :
FirePropertyChanged();
}
}
}
}
如问题中所述INotifyPropertyChanged : is [CallerMemberName] slow compared to alternatives?