【发布时间】:2011-08-04 08:40:42
【问题描述】:
我有一个实现 INotifyPropertyChanged 的类。我正在使用 Simon Cropp 的出色 NotifyPropertyWeaver 将 INotifyPropertyChanged 代码注入到属性中。但是,我现在需要修改一组属性的设置器,以便在设置完成后都执行相同的操作。修改 setter 需要创建支持字段、实现 get、实现 set 等,所有这些都具有相同的实现,除了支持字段的名称。我只是通过使用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()
{
....
}
}
【问题讨论】:
-
您能否提供一个更真实的代码示例,以便我更好地了解您想要实现的目标?
标签: c# .net inotifypropertychanged