是否存在适用于多个更改的 `INotifyPropertyChanged` 版本?

5

我在GoF一书中了解了观察者模式

.Net Framework 包含 INotifyPropertyChanged 接口。是否有类似的接口用于通知有关 属性集合 的更改而非每个属性的更改(以提高生产力)?

我为我的应用程序创建了这样的界面INotifySubjectChanged(其事件参数包含已更改的属性集),但是也许 .Net Framework 已经拥有它并且我发明了自行车。

我在 Bitbucket.org 上发布了我的简单代码源码在此处,这可能更清楚地说明了我想要做什么。

输入图片说明

输入图片说明

输入图片说明


我认为这是一个好问题,不知道为什么会被踩。也许有人知道更明确的答案,但我能想到的唯一方法就是对所有属性使用INotifyPropertyChanged - O. R. Mapper
@AndreyBushman,我对你尝试实现的概念感到困惑:当你不知道集合时,如何触发一个集合? - user57508
@MickyD,这使我只需编辑观察者一次(以提高生产力),而不必为每个主题属性的更改进行多次更改。 - Andrey Bushman
@vtortola,谢谢你,但我的类不是一个集合。此外,INotifyCollectionChanged不能让我知道更改属性的名称。 - Andrey Bushman
另一个问题,你无法解决:当你绑定你的User实体时,没有使用using (....GetNotificator())创建块/作用域 - 因此你的代码在例如WPF中无法工作。不管怎样,我相信这是你试图解决的一个具体问题,并没有被.NET框架所捕获(它有一个更通用的方法)。 - user57508
显示剩余14条评论
1个回答

3

MSDN指出,将属性名称留空意味着对象上的所有属性都已更改。

https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.propertychanged(v=vs.110).aspx

通过在PropertyChangedEventArgs中使用null或String.Empty作为属性名称,PropertyChanged事件可以表明对象上的所有属性都已更改。

这可能是你从.NET框架中得到的最接近你所要求的内容。请注意,在错误使用并在较少数量的属性更改时调用它可能会在某些情况下降低性能。

如果对象是一个集合(你说它不是),则可以利用INotifyCollectionChanged。

如果您关心性能和效率,请首先确保您实际上正在遇到性能问题,并且更改通知导致这些性能问题。

如果您不关心实现是否与WPF数据绑定一起工作,并且其行为相对清晰,则我认为自定义接口和事件没有任何问题。


基本上,这归结为使用一个块(使用using),在处理完成后调用 OnPropertyChanged(this, new PropertyChangdEventArgs(null)) - user57508
@AndreasNiedermair 我还不确定 using 块的用途,所以无法回答这个问题。在完成更改后,您应该调用此方法。如果您有一些属性仍然需要触发单独的 INotifyPropertyChange 事件的情况,您可能还希望在这次“set”更改期间抑制这些事件。 - plast1k
创建一个可丢弃的实例,并将发射包装在其 Dispose 方法中,只是另一种调用 user.StuffDone() 的方式,除了创建一个明确的作用域 :) - user57508
我在Bitbucket.org上发布了我的简单代码,并将链接添加到了我的主题中。这样或许更清楚我想做什么。 - Andrey Bushman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接