2011-09-08 57 views
5

我从来没有使用INotifyPropertyChanged,我正考虑在整个新应用程序中广泛使用它。INotifyPropertyChanged数据绑定外的用法

我的问题是,是“适当的”使用INotifyPropertyChanged接口,以比数据绑定控件其他东西提供活动通知?

它从一堆的例子在线看来,这个接口被广泛用于通知网格和这样当数据被改变。我有各种各样的场景,我需要其他类来通知其他类中的数据更改,我想知道是否认为实现此接口更清晰,并且对setter执行更改的调用,或者只是创建常规事件。

+3

只是出于好奇:为什么执行一个getter更改的调用? – WaltiD

+0

感谢您指出,并不意味着包括这一点。我已经更新了这个问题。 – mservidio

回答

4

当然,如果做出这样的选择,我倾向于使用超过其他构造的语言特征。

INotifyPropertyChanged的严重缺点是它只提供属性名称作为更新时的字符串,并且您的消费类必须解析该字符串并决定如何对其执行操作。

随着事件,你可以提供任何形式的委托签名的该事件需要和消费类可以直接在该变化问题采取行动。

如果引擎盖下偷看,你会发现,INotifyPropertyChanged的是一个事件,无论如何,那么为什么不直接使用事件?

+0

我倾向于使用常规活动。我同意,事情强类型事件将更好地合作。由于我使用的是T4代码生成模板,您认为在我的课程中为每个属性添加更改后的事件会是多么的矫枉过正? – mservidio

+0

@mservidio - 我不熟悉T4,但我敢打赌,你可以更新一个更清晰的课堂行为,而不是每个属性。 –

2

我想你可以使用这个接口对于那些情景,但是你要真正好好想想,如果你想你的类之间的这种thight coupeling。 如果这对你有意义 - 当然,为什么重新发明轮子?

1

我认为你应该继续实现INotifyPropertyChanged接口,仅仅因为它是为了这个目的而且它的用户界面用来获取更改,所以不需要自己创建自定义事件。

0

WPF和Silverlight都在数据绑定系统中广泛使用INotifyPropertyChanged。如果您要将数据绑定到您的对象,则应该定义使用INotifyPropertyChanged。 |

否则,据我所知,它不影响.NET Framework技术。

INotifyPropertyChanged不是您的属性更改时通知的最清洁的方式,具体取决于您如何查看它,因为有一个事件和一个带有属性名的字符串,您将不得不做一个switch语句。虽然

0

我不会使用INotifyPropertyChanged除了数据绑定之外的任何东西。此接口可能是数据绑定的唯一选项,因为将在PropertyChanged事件上采取行动的控件事先不知道发件人的类型。由于数据绑定必须使用这样的通用接口。

对于我自己的类型和场景,我会使用常规事件(每个属性可以更改其值的一个事件)。在这种情况下INotifyPropertyChanged是一种字符串类型的代码。你可以看到,即使WPF本身仍然充满了oldscool事件(FrameworkElement例如有很多***Changed事件)。

0

我觉得INotifyPropertyChanged通常是约属性值更新基于推送的通知的权利机制。

备选:

但是,它不是实现这一目标的唯一可能的机制。例如,Windows窗体也支持每个属性单独的…Changed事件;即如果您拥有名为Foo的房产,则可能会在Foo的设置人员中触发相关联的FooChanged事件。

具有单独的…Changed事件具有特定于某个特定属性的优势,因此不需要观察者/订阅者过滤掉他们不感兴趣的属性的通知。另一方面,您的(数据)一旦您必须声明50个额外的…Changed事件,对象可能开始感觉“体积庞大”。

有关实现INotifyPropertyChanged一些注意事项:

  • 如果你厌倦了重新写一遍又一遍相同的样板代码...:

    public T SomeProperty 
    { 
        get { … } 
        set 
        { 
         if (someProperty != value) 
         { 
          someProperty = value; 
          NotifyPropertyChanged("SomeProperty"); 
         } 
        } 
    } 
    private T someProperty; 
    

    ,那么你可能想考虑一个AOP框架(如PostSharp)。我记得CodePlex或Google Code上有一个库,可以为你自动执行INotifyPropertyChanged(或重写CIL字节码);不幸的是我不记得图书馆的名字。

  • 还有其他相关接口INotifyPropertyChanging,INotifyListChanged等您也许也想看看这些。

0

不要使用在其他情况下,如果你需要通知其他领域类使用域事件,而不是,这将是更加商业化和描述性和强类型

0

我不是INPC的粉丝外因为它隐藏了对象实例正在生成重要事件的事实。另外,如果我使用您的类实现INPC,我会期望所有属性都可以广播通知,如果只有其中一些属性发生,那么这是运行时可能会被忽视的错误。

相关问题