September 9,2008

Binding normal class to WPF control

以ListBox為例,它有一個ItemsSource的property可以讓你指定來源
通常一個簡單的List物件就可以讓它自動進行 binding

ListBox list_box = new ListBox();
List string_list = new List();

list_box.ItemsSource = string_list;

但是這樣子做有個問題,當你的string_list物件有了任何的增減或改變時
WPF的UI並不會自動的幫你更新list上的改變

有一個做法是使用下面的code,先將ItemsSource屬性清空再載入
強制它進行refresh的動作

list_box.ItemsSource = null;
list_box.ItemsSource = string_list;

但是這樣子必需要手動來,有點麻煩,正港的懶人做法如下

public  class  StringList : ObservableCollection<string>{}

StringList string_list = new StringList();
list_box.ItemsSource = string_list;

也就是宣告一個由ObservableCollection繼承下來的class來做為物件的container,由於ObservableCollection有實作INofiyPropertyChanged等interface,可以在物件有任何變化時,自動的通知WPF的UI進行update的動作

不過有一好沒兩好,由於這是全自動的,所以無法在UI thread以外進行對該container的操作,不然你就等著它吐Exception出來給你看囉

補充:
有人寫了一篇關於跨thread的WPF data binding 的文章,目前正研究中。

再補:
上面那篇最後的結論是,分成兩個List來操作,一個是專門用來binding的ObservableCollection,另一個則是真正用來處理增減、數值改變的List。上面再用一個Class包起來做統一的操作。不過根本之道還是得看微軟對於這個問題將來會不會推出什麼官方的解法了。


Posted by toki_kanno at 樂多Roodo! │10:10 │回應(0)引用(0).Net Framework
樂多分類:日記/一般 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/7142399