业务对象更改时自动刷新UI



这更像是一个设计问题。

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

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

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

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

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

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

你的想法?

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

使用消息传递系统。创建这样的委托:

public delegate void ObjectRefresh(BusinessObject obj);

然后,在您的BusinessObject类中:

public event ObjectRefresh;

当属性发生更改时:

if (ObjectRefresh)
    ObjectRefresh(this);

在你所有的ui上:

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

:)

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

如果没有,那么上面提到的Observer模式就是您想要的

看看Bindable Linq。。。Paul Stovell对此问题的解决方案。

http://www.codeplex.com/bindablelinq

如果它不能解决你的问题,它会给你一些自己写这篇文章的灵感。

读一读他的博客。

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

最新更新