C# - 当父级更改时更改子级

时间:2013-04-12 17:42:19

标签: c# winforms inheritance

我正在用C#,Windows Forms做一个应用程序。

在这个应用程序中,我有一个主窗体,里面有几个元素。这个"元素" class由其他人继承(" ElementLabel"," ElementPicture"," ElementGraph")。

在某些时候,我可能想要改变"批次"模式几个元素的某些属性,无论它们是什么。例如,我可能想要更改属性" Value"所有选定的元素。

问题是,例如,当财产"价值"在父类中更改,我也想更改属性" Text" "标签"存在于子类" ElementLabel"中。我已经看到很多关于通过孩子改变父母的话题,但不是。

我在这里遗漏了什么,或者我只是设计不好而且这种情况甚至不应该发生?

提前致谢

2 个答案:

答案 0 :(得分:1)

如果不了解更多有关您的体系结构的话,很难说最好的选择是什么,但是子类可以通过覆盖方法拦截父类中的事件。例如,在ElementLabel类中:

public override void set(String key, object newValue) {
    if (key.Equals("Value"))
        set("Text", "New label text!");
    base.set(key, newValue);
}

如果您想要更通用的解决方案,可以在父类中包含观察者模式;见the wikipedia page

答案 1 :(得分:1)

您可以为数据使用实现INotifyPropertyChanged的一个或多个类。

然后,您必须将子控件引用传递给您用于控制状态的“master”属性。 (理想情况下,它将由Controller类使用。)(我将此对象称为“主属性对象”。)

每个子控件都会订阅PropertyChanged事件。

然后当Controller更改其中一个主属性对象属性的值时,它将引发PropertyChanged事件,并且每个感兴趣的孩子都可以做出适当的响应。

这种方法有助于将控制器与视图分离。

序列是:

  1. 在创建子控件之前,请创建主属性对象。在Controller或Main Form中保留对此的引用(如果您将其用作控制器)。
  2. 传递给需要它的每个子控件,对主属性对象的引用。
  3. 每个子控件都应订阅主属性对象的PropertyChanged事件。
  4. 为每个孩子写一个合适的处理程序。它可以访问对主属性对象的引用,因此它可以看到任何属性的新值。
  5. 当需要更改属性时,Controller只需根据需要设置属性。属性设置器实现应该引发PropertyChanged事件,这将通知所有感兴趣的子控件,谁将更新其响应中的UI。
  6. [编辑]这实际上是Reyan在上面提到的观察者模式的实现。