2

这更像是一个设计问题。

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

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

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

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

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

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

你的意见?

4

4 回答 4

3

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

于 2008-10-10T03:02:29.780 回答
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
}

:)

于 2008-10-10T02:58:39.320 回答
0

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

http://www.codeplex.com/bindablelinq

如果它不能为您的问题提供解决方案,它会给您一些现场自己编写的内容。

也可以阅读他的博客。

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

于 2008-10-10T03:13:51.520 回答
0

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

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

于 2008-10-10T03:43:41.837 回答