1

我正在用 C#、Windows 窗体做一个应用程序。

在这个应用程序中,我有一个包含多个元素的主表单。这个“Element”类被其他类继承(“ElementLabel”、“ElementPicture”、“ElementGraph”)。

在某些时候,我可能想在“批处理”模式下更改几个元素的某些属性,无论它们是什么。例如,我可能想更改所有选定元素的属性“值”。

问题是,例如,当父类中的属性“Value”发生更改时,我还想更改子类“ElementLabel”中存在的“Label”的属性“Text”。我已经看到很多关于通过孩子改变父母的话题,但不是这样。

我是否在这里遗漏了什么,或者我只是有一个糟糕的设计,甚至不应该发生这样的情况?

提前致谢

4

2 回答 2

2

好吧,在不了解您的架构的情况下很难说最好的选择是什么,但是子类可以通过覆盖方法来拦截父类中的事件。例如,在您的 ElementLabel 类中:

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

如果你想要一个更通用的解决方案,你可以在你的父类中包含一个观察者模式;见维基百科页面

于 2013-04-12T17:51:30.487 回答
1

您可以将实现INotifyPropertyChanged.

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

每个子控件都将订阅该PropertyChanged事件。

然后当 Controller 改变主属性对象的属性之一的值时,它会引发PropertyChanged事件,每个感兴趣的子对象都可以适当地响应。

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

顺序是:

  1. 在创建子控件之前,先创建主属性对象。在控制器或主窗体中保留对此的引用(如果您将其用作控制器)。
  2. 将对主属性对象的引用传递给每个需要它的子控件。
  3. 每个子控件都应该订阅主属性对象的PropertyChanged事件。
  4. 为每个孩子编写一个适当的处理程序。它将有权访问对主属性对象的引用,因此它将能够看到任何属性的新值。
  5. 当需要更改属性时,控制器只需根据需要设置属性。属性设置器实现应该引发PropertyChanged事件,这将通知所有感兴趣的子控件,它们将更新其 UI 作为响应。

[编辑] 这实际上是 Reyan 上面提到的观察者模式的实现。

于 2013-04-12T17:59:08.573 回答