数据绑定控件,封装的最佳实践

时间:2009-10-06 17:23:33

标签: c# winforms data-binding

我最近一直在使用c#中的数据绑定,虽然我这样做的方式很直接且有效,但感觉不是最好的方法。

例如,我有一个管理器类,即UserManager,它具有以下接口:

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

所以AdduserRemoveUser应控制列表,并将Users集合作为输出。我在绑定中使用此集合,即:

listBindingSource.DataSource = userManager.Users;

然后我通过绑定操作列表,即

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

当然,这是有效的,但我完全绕过那里的UserManagerAddUser / RemoveUser功能!这当然看起来非常错误。使用数据绑定的正确方法是什么?

UserManager在lib里面,所以我不想在那里放任何绑定对象,因为我觉得应该是一个gui的东西。另一方面,通过绑定,我的gui完全控制了我的收藏。

1 个答案:

答案 0 :(得分:1)

正如你的代码现在一样,你不能做你想要的事情。在某些时候,集合必须支持IBindingList接口(这是您在表单上的BindingSource对象所做的)。如果您想使用UserManager类进行操作,出于实际目的,您必须更改Users属性的内部数据存储以使用BindingList<User>(您应该仍然能够像现在一样将其输入为IList<User>,只需将实际的具体实现更改为BindingList<User>)。这样做会将IBindingList接口暴露给网格,它将检测在其他地方(即UserManager类中)所做的更改。

但是,这只会导致它选择对列表所做的更改,而不是对列表中包含的单个元素进行更改(换句话说,添加和删除将反映在UI上,但修改不会是)。为了实现这一点,您需要在IPropertyChanged类上实现User(假设它还没有)。