3 回答

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊
該INotifyPropertyChanged接口是與事件實(shí)現(xiàn)。該界面只有一個(gè)成員,PropertyChanged這是消費(fèi)者可以訂閱的事件。
理查德發(fā)布的版本不安全。以下是安全實(shí)現(xiàn)此接口的方法:
public class MyClass : INotifyPropertyChanged
{
private string imageFullPath;
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, e);
}
protected void OnPropertyChanged(string propertyName)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
public string ImageFullPath
{
get { return imageFullPath; }
set
{
if (value != imageFullPath)
{
imageFullPath = value;
OnPropertyChanged("ImageFullPath");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
請(qǐng)注意,這將執(zhí)行以下操作:
抽象屬性更改通知方法,以便您可以輕松地將其應(yīng)用于其他屬性;
在嘗試調(diào)用PropertyChanged代理之前,先制作該代理的副本(否則,將創(chuàng)建競(jìng)爭(zhēng)條件)。
正確實(shí)現(xiàn)INotifyPropertyChanged接口。
如果要為更改的特定屬性另外創(chuàng)建通知,則可以添加以下代碼:
protected void OnImageFullPathChanged(EventArgs e)
{
EventHandler handler = ImageFullPathChanged;
if (handler != null)
handler(this, e);
}
public event EventHandler ImageFullPathChanged;
然后在該行OnImageFullPathChanged(EventArgs.Empty)之后添加該行OnPropertyChanged("ImageFullPath")。
由于我們有.Net 4.5,因此存在CallerMemberAttribute,它可以擺脫源代碼中屬性名稱的硬編碼字符串:
protected void OnPropertyChanged(
[System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
public string ImageFullPath
{
get { return imageFullPath; }
set
{
if (value != imageFullPath)
{
imageFullPath = value;
OnPropertyChanged();
}
}
}

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊
我使用與Aaronaught大致相同的模式,但是如果您有很多屬性,最好使用一些通用方法魔術(shù)使代碼更干燥。
public class TheClass : INotifyPropertyChanged {
private int _property1;
private string _property2;
private double _property3;
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) {
PropertyChangedEventHandler handler = PropertyChanged;
if(handler != null) {
handler(this, e);
}
}
protected void SetPropertyField<T>(string propertyName, ref T field, T newValue) {
if(!EqualityComparer<T>.Default.Equals(field, newValue)) {
field = newValue;
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
}
public int Property1 {
get { return _property1; }
set { SetPropertyField("Property1", ref _property1, value); }
}
public string Property2 {
get { return _property2; }
set { SetPropertyField("Property2", ref _property2, value); }
}
public double Property3 {
get { return _property3; }
set { SetPropertyField("Property3", ref _property3, value); }
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
通常,我還將OnPropertyChanged方法設(shè)為虛擬,以允許子類覆蓋它以捕獲屬性更改。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
INotifyPropertyChanged正是在屬性更改時(shí)引發(fā)事件。要實(shí)現(xiàn)INotifyPropertyChanged,需要一個(gè)成員,即PropertyChanged事件。您自己實(shí)現(xiàn)的任何內(nèi)容都可能與該實(shí)現(xiàn)相同,因此不使用它沒有任何好處。
- 3 回答
- 0 關(guān)注
- 703 瀏覽
添加回答
舉報(bào)