gpt4 book ai didi

c# - 将新对象实例分配给绑定(bind)变量时数据绑定(bind)不起作用

转载 作者:太空狗 更新时间:2023-10-29 20:26:51 25 4
gpt4 key购买 nike

我有一个对象,我已使用 C# WinForms(针对 .NET 4.5.2)绑定(bind)到窗体上的控件。我已经实现了 INotifyPropertyChanged,当我修改该对象的属性时,它会按预期更新窗体的控件。但是,当我将此对象的实例更改为新实例时,它将不再更新控件,即使我尝试修改特定的属性。

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 实例,只需将其分配给 BindingSourceDataSource 属性即可:

初始:

dataSource.DataSource = new User("Example Name");

稍后:

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

关于c# - 将新对象实例分配给绑定(bind)变量时数据绑定(bind)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39817261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com