2010-01-27 67 views
4

我有一个数据库,其中包含一个记录来自各种来源的数据的表。 3列WPF高频数据绑定

'源' '值' '时间戳'

例如

source1中21 '11:03'

source6 22 '11:03'

source9 456 '11:03'

该表被更新的第二2至3倍。 每个值可能会也可能不会更改。 每个“源”值都显示在屏幕上的单独标签或文本框中(不在网格中)。 我需要找到最好的方法来获取这些数据绑定到WPF控件。 我应该在Dictionary,DataTable等中保存什么类型的对象。

什么类型的对象要保存数据? 如何将我的Label或TextBox绑定到该值。

我每秒查询信息源2到4次。 绝大多数时间数据库表中的值不会更改 通常只有一个值发生更改 有时它们全部更改 我只希望拥有最多约30个独特的数据源。

请把你的思想上限。

回答

2

只是偶然我正在通过一个非常类似的问题。像我一样,我假设你正在后台线程中更新数据。

集合

使用MTObservableCollection代替的ObservableCollection来存储数据。 ObservableCollection通常用于可以更改的内容的数据绑定,但不能从后台线程更新。 MTObservableCollection适用于我,但它不是继承线程安全的,所以要小心。

http://www.julmar.com/blog/mark/2009/04/01/AddingToAnObservableCollectionFromABackgroundThread.aspx

模型

每个对象应该实现INotifyPropertyChanged接口。这将使他们支持数据绑定。此外,WPF允许您在托架线程上以这种方式更新属性。

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

不想更新了清除,并添加

,请务必在何时可以更新对象。不要只清除收集并重新加载它,这将是非常昂贵的,并导致不利的UI效果。当然,您可以在需要时进行单独添加和删除。

1

我对此并不十分清楚,但看起来表格是已更新每秒2到4次。它是否正确?

如果是这样,那么设置一个线程来查询表并更新一个内存集合中的对象,当更新时触发一个事件似乎是一个合理的方法。如果你使这些对象实现了INotifyPropertyChanged,你可以直接绑定到对象的属性,然后当它们在后台更新时,UI将会自动更新(当然,要小心线程编组)。

+0

除非你做一些特别的东西,添加或删除从集合整个项目将导致异常。 – 2010-01-27 01:33:21

+0

@Johnathan - 为什么要添加和删除项目?我认为如果更新数据和附加数据的假设成立,那么更新它们是更合理的。 – codekaizen 2010-01-27 01:35:08

+0

是的,通过一切手段尽可能地更新。但是如果你的查询现在返回10行,下一次返回11行,会发生什么? – 2010-01-27 01:39:39

0

选择2 - 消息队列

而是在后台线程更新收藏,您只需建立增量(更改列表)。使用低优先级的Dispatcher.BeginInvoke将这些更改抽取到GUI线程中,可能是Background或ContextIdle。

一旦调度员拿起你的修改,它就会在你的GUI线程上运行它们。这可以让您避免所有令人讨厌的线程影响。通过调整优先级别,您可以调整它以获取更新速度与用户响应速度。

再次确保您使用更新而不是删除和替换。

0

我很想知道Reactive Extensions是否可以在这种情况下帮助你。使用它们,不需要将数据“拉”到表单中,可以从事件源“推送”数据以更新控件。只是一个想法。希望它有帮助,或者至少有趣!