【问题标题】:Auto refreshing the UI when business objects change业务对象更改时自动刷新 UI
【发布时间】:2010-09-16 10:34:45
【问题描述】:

这更像是一个设计问题。

我正在构建一个以各种方式显示业务对象的工具(即树节点、列表视图项、组合框、文本字段等)。每当用户更改其中任何一个时,都会引发一个事件,表明该业务对象已更改或它所属的集合已更改。由于此业务对象或它可能属于的集合可能显示在多个位置,因此每个 UI 元素都需要更新以反映此更改。是否有一种优雅的解决方案可以在发生更改时正确更新每种类型的 UI 元素?

我对如何做到这一点有一些想法,但我想看看是否有人遇到过这个问题并对他们的解决方案感到满意。这是一个 C# WinForm,但解决方案可以是任何语言。

我目前对这个问题的想法和可能的解决方案:

当您的业务对象成为 TreeNodeCollection/ListViewITemCollection/ComboBoxItemCollection 的一部分并且对集合调用 Clear() 时,当您想要清理事件绑定(即 businessObject.Changed -= ObjectChanged)时,情况会变得更加复杂。

“服务”怎么样,每个对象及其 ui 元素都可以在其中注册,可以在一个位置监听业务对象的事件,并且每个 UI 元素都会在引发事件时更新?当所有 UI 元素都自行注销时,将删除对该对象事件的订阅。

此解决方案的问题在于,每个控件都必须负责在每次创建时注册 UI 组件和对象 - 这可能会变得混乱。

你的想法?

【问题讨论】:

  • 我很确定有一个设计模式。

标签: c# winforms user-interface refresh


【解决方案1】:

您可能想尝试观察者模式。 http://en.wikipedia.org/wiki/Observer_pattern

【讨论】:

  • 并进一步扩展到 MVC 或 MVP 模式。
  • 这是我见过的最好的解释,还有多种语言的例子。
【解决方案2】:

使用消息系统。像这样创建一个委托:

public delegate void ObjectRefresh(BusinessObject obj);

然后,在您的 BusinessObject 类中:

public event ObjectRefresh;

当一个属性改变时:

if (ObjectRefresh)
    ObjectRefresh(this);

在你所有的用户界面上:

BusinessObject obj = GetBusinessObject();
obj.ObjectRefresh += this.ObjectRefresh;
...
private void ObjectRefresh(BusinessObject obj)
{
    // update UI
}

:)

【讨论】:

  • 我建议将调用委托的代码放在它自己的(受保护的)方法 OnObjectRefresh 中。
【解决方案3】:

确保你真的需要这个,即它还没有发生。例如,如果您的 GUI 对象绑定到数据集,并且您的业务对象将更改合并到数据集中,则数据集将自动通知 gui 对象数据已更改;数据库 gui 对象会自动更新自己

如果不是,那么上面提到的观察者模式就是你想要的

【讨论】:

    【解决方案4】:

    看看 Bindable Linq ... Paul Stovell 对这个问题的解决方案。

    http://www.codeplex.com/bindablelinq

    如果它没有为您的问题提供解决方案,它会让您自己编写此内容。

    也可以阅读他的博客。

    http://www.paulstovell.com/blog/

    【讨论】:

      猜你喜欢
      • 2021-10-09
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      相关资源
      最近更新 更多