2009-10-06 70 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