我有一个对象,该对象已绑定(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实例,只需将其分配给DataSourceBindingSource属性即可:

最初的:
dataSource.DataSource = new User("Example Name");

之后:
dataSource.DataSource = new User("New Name");

09-10 12:40
查看更多