我有一个对象,该对象已绑定(bind)到使用C#WinForms(定位.NET 4.5.2)的表单上的控件。我已经实现了INotifyPropertyChanged
,当我修改此对象的属性时,它会按预期在窗体的控件上更新。但是,当我将此对象的实例更改为新实例时,即使我尝试修改特定的Property,它也将不再更新控件。
class User : INotifyPropertyChanged
{
string _name = "";
public string Name
{
get { return _name; }
set { _name = value; OnPropertyChanged("Name"); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string property)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
}
public User() { }
public User(string name)
{
Name = name;
}
public User(User otherUser)
{
Name = otherUser.Name;
}
}
并在表格上我有
User currentUser = new User("Example Name");
lblName.DataBindings.Add("Text", currentUser, "Name");
正确更新。我可以使用
currentUser.Name = "Blahblah";
更改名称,并且效果很好。当我尝试调用currentUser = new User("New Name");
时,无论我做什么,它都将不再更新。据我了解,对象的特定实例是控件所绑定(bind)的对象。我的主要目标是不必手动遍历较大对象的每个属性,而不必每次想更改实例时都手动更改所有内容。
我的问题:是否有一种方法可以更改对象的实例而又不删除与控件的绑定(bind)?
最佳答案
为了获得理想的行为,您不应该像当前那样直接绑定(bind)到具体实例:
lblName.DataBindings.Add("Text", currentUser, "Name");
相反,您需要一些中介。最简单的方法就是使用
BindingSource
组件。在表单中添加一个
BindingSource
字段:private BindingSource dataSource;
然后初始化它并将控件绑定(bind)到它一次(通常以
Load
事件的形式):dataSource = new BindingSource { DataSource = typeof(User) };
lblName.DataBindings.Add("Text", dataSource, "Name");
// ...
现在,只要您想绑定(bind)到
User
实例,只需将其分配给DataSource
的BindingSource
属性即可:最初的:
dataSource.DataSource = new User("Example Name");
之后:
dataSource.DataSource = new User("New Name");