我有一个解决方案,我将一个项目的集合从一个源传递给一个演示者。当源代码更新时,我希望能够通知演示者显示新的结果。
我想到的是创建一个ChangeNotification类,将其与结果一起传递,并让该类通知演示者。在我看来,这可以通过两种方式实现,一种是ChangeNotification可以有presenter订阅的事件,另一种是它可以有presenter设置的委托和源调用(如果它不为空)。
使用事件的好处是,不仅仅是消费者可以对通知做出反应,你可以将响应式扩展挂接到通知上,缺点是你必须管理事件的订阅/订阅,以便进行适当的垃圾收集。委托很简单,但是你失去了一些灵活性。
对于这种情况,最优雅的模式是什么?有没有其他我没想过的方法?
发布于 2010-11-19 09:58:03
如果您将有多个观察者,则需要事件或MultipleDelegates。如果您只有一个观察者,并且想要强制执行,那么委托就足够了。然而,就哪一个是最好的而言,我想说这个事件更灵活,并且非常适合这种模式。ObservableCollection和INotifyPropertyChanged是基于事件的实现。顺便说一下,对于这些类的引用,+1到tbischel。
发布于 2010-11-19 08:54:30
这个场景有两个内置的模式。
首先,您可以实现INotifyPropertyChanged接口。如果要在集合中对象本身的属性更改时通知演示者,这会更好。(或者源对象本身,如果这是发生更改的地方)。
第二种方法是向演示者传递一个包含您的对象的ObservableCollection。如果要通知演示者已在集合中添加或删除项,则此方法更好。两者都是事件驱动的模型,任何订阅者都可以连接到。
编辑:底层模式是"Observer"模式...如果你愿意,你可以推出你自己的版本,你已经把细节写下来了。
发布于 2011-05-19 12:02:13
我同意其他答案,即INotifyPropertyChanged、INotifyCollectionChanged和其他相关接口是第一个要求助的属性,但我想添加第三个选项,即实现观察者模式。如果您不熟悉这种模式,那么可以看看Java是如何通过所谓的event listeners来实现事件功能的。但是,没有理由不能在C#中采用这种模式,在某些情况下,它可能提供比使用事件和委托更优雅的解决方案,特别是当可能有几个协调的事件,这些事件通常都由感兴趣的一方订阅时。
另一种选择也是从DependencyObject派生并实现DependencyProperties,以便获得内置的、针对WPF进行优化的更改通知。我倾向于不走这条路,因为我不喜欢有一个特定的基类的要求,但有一些很好的理由来解释为什么它有时是正确的选择,事实上,一些MVVM框架甚至也将它用作ViewModel类的更改通知的基础。
https://stackoverflow.com/questions/4221162
复制相似问题