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()
    {
        ....
    }
}
    
已邀请:
一方面,您只需实现OnPropertyChanged,而不必使用该事件。 其次,这被认为是不好的形式。 NotifyPropertyWeaver在代码中进行了大量检查,并检测属性之间的依赖关系。例如,如果您在属性B的代码内使用属性A,则NotifyPropertyWeaver将在代码A的内部为B添加第二个OnPropertyChanged,以确保所有内容都已更新。 简而言之,不要那样做,输入所有内容。     
我已经完成了以前使用过的此/二手代码,并且没有发现任何明智的副作用。根据属性的数量,您可能会看到性能下降,但这可能很小。我注意到的是,在查看代码时并不总是立即清楚为什么使用此模式时会发生效果。您必须要注意的是如何设计课程。当您快速将类组合在一起时,自动属性会很不错,但是它们可能会阻碍您的整体设计。我通常不使用它们,除非它是一个对象的快速模型或它用于传输数据的非常简单的对象。您必须问自己的问题是,是否以这种方式设计对象是因为其最适合您的代码,程序,样式的方式,还是因为您尝试使用特定功能(即自动属性)。 要考虑的一件事是,您要对每个字段执行相同的操作,还是要执行不同的操作?如果您有不同的操作,则很快就会遇到麻烦的方法。如果它们是相同的动作,则可能更易于管理。 我实现
INotifyProperty
接口的通常方法是创建一个更改字段,执行通知的方法,也可以在进行更改后以
Action
执行。这样就避免了所有大的条件语句,并且可以对动作进行精细控制,但是具有足够的精细控制以完全灵活。如果我要创建许多相关的对象,通常也只需创建一个基类以继承所有这些对象,并将该更改方法作为受保护的方法从中继承所有基类,因此我不必一次重新实现模式每堂课。     
我已向NotifyPropertyWeaver添加了On_PropertyName_Changed功能 http://code.google.com/p/notifypropertyweaver/wiki/On_PropertyName_Changed 所以如果你写这个
public class Foo : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
    public string Prop4 { get; set; }

    void OnProp3Changed()
    {
    }

    void OnProp4Changed()
    {
    }
}
对OnProp3Changed和OnProp4Changed的调用将分别注入到Prop3和Prop4的集合中。     

要回复问题请先登录注册