2009-10-06 61 views
1

最佳做法,我最近一直使用的數據在C#約束力,而我做的方式是直接和工作,它不覺得自己是最好的辦法。數據綁定控件,用於封裝

例如,我有一個管理器類,即的UserManager它具有以下接口:

class UserManager 
{ 
    public IList<User> Users { get; ...} 
    public AddUser(...) 
    public RemoveUser(...) 
} 

所以AdduserRemoveUser應控制列表,與Users集合作爲輸出。我使用這個集合中結合,即:

listBindingSource.DataSource = userManager.Users; 

我然後通過綁定操作的列表,即

listBindingSource.Add(new User(...)) 

這個工作,當然,但我完全繞過UserManager和在那裏的功能AddUser/RemoveUser!這當然顯得非常錯誤。什麼是使用數據綁定的正確方法?

UserManager是一個lib裏面,所以我不想把任何綁定對象在那裏,因爲我覺得這應該是一個GUI的事情。另一方面,通過綁定,我的gui完全控制了我的收藏。

回答

1

當你的代碼現在站立,你不能做什麼你之後。在某些情況下,該集合必須支持IBindingList接口(這是您在窗體上的BindingSource對象)。如果你想利用你的UserManager類做的操作,出於實用的目的,你必須改變內部數據存儲爲Users財產使用BindingList<User>(你應該仍然能夠返回其類型爲IList<User>作爲您現在只需將實際的具體實現更改爲BindingList<User>)。這樣做會將IBindingList接口暴露給網格,並且它會檢測其他地方發生的更改,即在UserManager類中。

但是,這隻會導致它接受對列表所做的更改,而不是列表中包含的單個元素(換句話說,添加和刪除將反映在UI上,但修改獲勝不會)。爲了做到這一點,您需要在User類上實現IPropertyChanged(假設它尚未)。

+0

謝謝,這是非常好的信息。我有點擔心必須將我的內部列表指定爲BindingList,因爲我覺得它不需要知道它將如何使用。但我想這個替代方案會是一些中間轉換層,對於一個小項目來說這並不值得。 – DanDan 2009-10-06 20:10:30

+0

'BindingList'被設計爲與表示無關。它所做的只是爲檢測變化提供必要的基礎設施。無論您使用的是何種數據綁定方案,*都具有*作爲變更跟蹤(或更確切地說,更改通知*)系統,以便更改數據自動反映在GUI上。使用'BindingList '沒有什麼「臭」。 – 2009-10-06 20:44:53