使用观察者模式将属性更改传播到父级

时间:2018-01-30 04:39:50

标签: c# design-patterns

我正在试图找出将属性更改传播到父类的最佳方法。

例如。

A类有B类清单。 B类有C类清单。 C类有一个名为“IsSelected”的属性

我希望在C类中更改“IsSelected”属性时通知A类。

我花了很长时间用Google搜索找到一个明确的解决方案。其中大多数都包括设置事件和触发器,这似乎有点麻烦......

我正在考虑的一个解决方案是使用一个观察者模式,其中类C存储观察者列表,即类A.类B只是将类A的引用传递给C以供其订阅。当“IsSelected”属性被更改时,它会通知订阅者。

这似乎不是解决这个问题的常用方法,因此我对提交它犹豫不决。我缺少这种设计是否有任何明显的缺陷?

2 个答案:

答案 0 :(得分:1)

我不确定在这种情况下,观察者模式比引用或事件,任何其他模式都有任何优势。

根据您描述的简单情况,观察者或发布/订阅结构世界上没有任何错误,但是有其他解决方案可能适合您的解决方案,它只取决于您的设计约束

观察者模式的理想情况

  • 需要将对象状态的更改通知给一组依赖对象,而不是所有依赖对象。
  • 需要通知功能。
  • 发送通知的对象无需了解接收器对象。

您可以轻松证明以下解决方案的合理性

  • 在构造函数中传递的父引用,或设置为属性
    • 每次创建和添加C类时,只需传入对A类的引用
  • 代表/事件/动作
    • 每次创建和添加C类订阅事件等
  • 解耦消息传递或事件聚合器
    • 如果选择了更改,则只需发布到分离的消息服务或队列
  • 在wpf中,您可以使用触发器在父项ViewModels中引发命令
  

这真的取决于谁在制作这些子类以及如何/为什么,你   应该选择最适合概念设计的模式   你的模特;这是最直接,最容易维护的   在你的情况下。

答案 1 :(得分:0)

如果我理解你的问题,如果你想使用Observer模式 您可以在B中设置方法,并且只要Isselected更改了调用b.CisSelectedChanged();,因为您的C类中已经有B实例。再次在这个方法中再次调用A. Somethhign的另一种方法,就像这样

class C
{
    bool isselected  = true;// for example get a new value , should be notified
    B b = new B();
    b.CisSelectedChanged();
}

class B
{
    public CisSelectedChanged()
    {
        A a = new a;
        a.CisSelectedChanged();
    }
}

这就是观察者模式的工作原理,但无论如何都需要通过更改属性的值来通知