我有一个数据库,其中包含一个记录来自各种来源的数据的表。 3栏
'来源''价值''时间戳'
e.g。
source1 21 '11:03'
source6 22 '11:03'
source9 456 '11:03'
该表每秒更新2到3次。 每个价值可能会也可能不会改变。 每个“源”值都显示在屏幕上的单独标签或文本框中(不在网格中)。 我需要找到最佳方法来使这些数据绑定到WPF控制器。 我应该在Dictionary,DataTable等中保存什么类型的对象。
什么类型的对象将保存数据? 如何将Label或TextBox绑定到值。
我每秒查询两到四次来源。 绝大多数情况下,数据库表中的值不会更改 通常只有一个值会发生变化 有时他们都会改变 我只希望有大约30个独特的数据源。
请考虑你的想法。
答案 0 :(得分:2)
我偶然遇到了一个非常类似的问题。像我一样,我假设您正在后台线程中更新数据。
收藏
使用MTObservableCollection而不是ObservableCollection来存储数据。 ObservableCollection通常用于对可以更改的内容进行数据绑定,但无法从后台线程更新。 MTObservableCollection对我有用,但它不是继承线程安全的,所以要小心。
http://www.julmar.com/blog/mark/2009/04/01/AddingToAnObservableCollectionFromABackgroundThread.aspx
<强>模型强>
每个对象都应该实现INotifyPropertyChanged接口。这将使它们支持数据绑定。此外,WPF允许您以这种方式在brackground线程上更新属性。
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx
首选清除更新并添加
确保在可能的情况下始终更新对象。不要只是清除集合并重新加载它,这将非常昂贵并导致不利的UI效果。当然,您可以在需要时进行单独添加和删除。
答案 1 :(得分:1)
我对此并不十分清楚,但似乎表每秒更新 2到4次。这是对的吗?
如果是这样,那么设置一个线程来查询表并更新内存中的对象集合,这些对象在更新时触发事件似乎是一种合理的方法。如果您使这些对象实现INotifyPropertyChanged
,您可以直接绑定到对象的属性,然后在后台更新它们时,UI将自动更新(当然要小心线程编组)。
答案 2 :(得分:0)
选项2 - 消息队列
不要在后台线程上更新集合,只需创建增量(更改列表)。使用具有低优先级的Dispatcher.BeginInvoke(可能是Background或ContextIdle)将这些更改泵入GUI线程。
一旦调度程序接收到您的更改,它将在您的GUI线程上运行它们。这允许您避免所有令人讨厌的线程影响。通过调整优先级,您可以根据更新速度与用户响应性进行调整。
同样,请确保使用更新而不是删除和替换。
答案 3 :(得分:0)
我很想知道Reactive Extensions是否可以帮助您解决这种情况。使用它们,而不是将数据“拉”到表单中,可以从事件源“推送”数据以更新控件。只是一个想法。希望它有用,或至少有趣!