我最近一直在使用c#中的数据绑定,虽然我这样做的方式很直接且有效,但感觉不是最好的方法。
例如,我有一个管理器类,即UserManager,它具有以下接口:
class UserManager
{
public IList<User> Users { get; ...}
public AddUser(...)
public RemoveUser(...)
}
所以Adduser
和RemoveUser
应控制列表,并将Users
集合作为输出。我在绑定中使用此集合,即:
listBindingSource.DataSource = userManager.Users;
然后我通过绑定操作列表,即
listBindingSource.Add(new User(...))
当然,这是有效的,但我完全绕过那里的UserManager
和AddUser
/ RemoveUser
功能!这当然看起来非常错误。使用数据绑定的正确方法是什么?
UserManager
在lib里面,所以我不想在那里放任何绑定对象,因为我觉得应该是一个gui的东西。另一方面,通过绑定,我的gui完全控制了我的收藏。
答案 0 :(得分:1)
正如你的代码现在一样,你不能做你想要的事情。在某些时候,集合必须支持IBindingList
接口(这是您在表单上的BindingSource
对象所做的)。如果您想使用UserManager
类进行操作,出于实际目的,您必须更改Users
属性的内部数据存储以使用BindingList<User>
(您应该仍然能够像现在一样将其输入为IList<User>
,只需将实际的具体实现更改为BindingList<User>
)。这样做会将IBindingList
接口暴露给网格,它将检测在其他地方(即UserManager
类中)所做的更改。
但是,这只会导致它选择对列表所做的更改,而不是对列表中包含的单个元素进行更改(换句话说,添加和删除将反映在UI上,但修改不会是)。为了实现这一点,您需要在IPropertyChanged
类上实现User
(假设它还没有)。