我有一個實現INotifyPropertyChanged的類。我使用Simon Cropp的優秀NotifyPropertyWeaver將INotifyPropertyChanged代碼注入到屬性中。不過,我現在需要修改一組屬性的setter,以便在set完成後都做同樣的事情。修改setters需要創建後臺字段,實現get,實現set等等,除了後臺字段的名稱外,其他實現都是相同的。我只是通過使用NotifyPropertyWeaver來避免所有這些。INotifyPropertyChanged訂閱自我
相反,我可以讓我的類訂閱它自己的PropertyChanged事件並處理事件處理程序中的更改後操作。這是一件安全的事情嗎?我意識到如果我的操作修改了我正在觀察的某個屬性,我將不得不注意導致堆棧溢出的無限遞歸。我還需要注意哪些其他問題?
下面是一個例子
public class Foo : INotifyPropertyChanged{
public event PropertyChangedEventHandler PropertyChanged;
public Prop1 { get; set; }
public Prop2 { get; set; }
public Prop3 { get; set; }
public Prop4 { get; set; }
public Foo(){
this.PropertyChanged +=
new PropertyChangedEventHandler(Foo_PropertyChanged);
}
private void Foo_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "Prop1":
case "Prop2":
case "Prop3":
DoSomething();
break;
case "Prop4":
DoSomethingElse();
break;
}
}
private void DoSomething()
{
....
}
private void DoSomethingElse()
{
....
}
}
編輯
Joel Lucsy好心指出,我並不需要訂閱的事件。我一直在允許NotifyPropertyWeaver注入OnPropertyChanged。相反,我可以自己實現OnPropertyChanged來完成同樣的事情。
更新代碼:
public class Foo : INotifyPropertyChanged{
public event PropertyChangedEventHandler PropertyChanged;
public Prop1 { get; set; }
public Prop2 { get; set; }
public Prop3 { get; set; }
public Prop4 { get; set; }
private void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
switch (propertyName)
{
case "Prop1":
case "Prop2":
case "Prop3":
DoSomething();
break;
case "Prop4":
DoSomethingElse();
break;
}
}
private void DoSomething()
{
....
}
private void DoSomethingElse()
{
....
}
}
你可以給一個更真實的世界代碼示例,這樣我可以更好地理解你在追求什麼? – Simon 2011-04-13 22:27:38