INotifyPropertyChanged订阅self
|
我有一个实现INotifyPropertyChanged的类。我正在使用Simon Cropp的出色的NotifyPropertyWeaver将INotifyPropertyChanged代码注入到属性中。但是,我现在需要修改一组属性的设置器,以在设置完成后全部执行相同的操作。修改设置器需要创建后备字段,实现get,实现集合等,所有操作都具有相同的实现,但后备字段的名称除外。我只是通过使用NotifyPropertyWeaver避免了所有这些事情。
相反,我可以让我的类订阅它自己的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()
{
....
}
}
没有找到相关结果
已邀请:
3 个回复
烷刨画颠离
茶鬼失形
接口的通常方法是创建一个更改字段,执行通知的方法,也可以在进行更改后以
执行。这样就避免了所有大的条件语句,并且可以对动作进行精细控制,但是具有足够的精细控制以完全灵活。如果我要创建许多相关的对象,通常也只需创建一个基类以继承所有这些对象,并将该更改方法作为受保护的方法从中继承所有基类,因此我不必一次重新实现模式每堂课。
辩谷变充
对OnProp3Changed和OnProp4Changed的调用将分别注入到Prop3和Prop4的集合中。