2010-01-27 68 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是否可以在這種情況下幫助你。使用它們,不需要將數據「拉」到表單中,可以從事件源「推送」數據以更新控件。只是一個想法。希望它有幫助,或者至少有趣!