我正在用C#,Windows Forms做一个应用程序。
在这个应用程序中,我有一个主窗体,里面有几个元素。这个"元素" class由其他人继承(" ElementLabel"," ElementPicture"," ElementGraph")。
在某些时候,我可能想要改变"批次"模式几个元素的某些属性,无论它们是什么。例如,我可能想要更改属性" Value"所有选定的元素。
问题是,例如,当财产"价值"在父类中更改,我也想更改属性" Text" "标签"存在于子类" ElementLabel"中。我已经看到很多关于通过孩子改变父母的话题,但不是。
我在这里遗漏了什么,或者我只是设计不好而且这种情况甚至不应该发生?
提前致谢
答案 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
事件,并且每个感兴趣的孩子都可以做出适当的响应。
这种方法有助于将控制器与视图分离。
序列是:
PropertyChanged
事件。PropertyChanged
事件,这将通知所有感兴趣的子控件,谁将更新其响应中的UI。[编辑]这实际上是Reyan在上面提到的观察者模式的实现。