C#Winforms数据绑定

C#Winforms数据绑定,c#,winforms,C#,Winforms,快速问题: 我有一个usercontrol,我正在向它传递一个业务对象,以便进行编辑和保存。usercontrol在保存后不会被销毁,而是在下一个businessobject传递给它之前被隐藏 问题是,除非执行以下操作,否则无法刷新控件中的数据: UsernameTextEdit.DataBindings.Clear(); UsernameTextEdit.DataBindings.Add("EditValue", entityBo, "Username", true, DataSourceUp

快速问题:

我有一个usercontrol,我正在向它传递一个业务对象,以便进行编辑和保存。usercontrol在保存后不会被销毁,而是在下一个businessobject传递给它之前被隐藏

问题是,除非执行以下操作,否则无法刷新控件中的数据:

UsernameTextEdit.DataBindings.Clear();
UsernameTextEdit.DataBindings.Add("EditValue", entityBo, "Username", true, DataSourceUpdateMode.OnPropertyChanged);
LastNameTextEdit.DataBindings.Clear();
LastNameTextEdit.DataBindings.Add("EditValue", entityBo, "LastName", true, DataSourceUpdateMode.OnPropertyChanged);
FirstNameTextEdit.DataBindings.Clear();
FirstNameTextEdit.DataBindings.Add("EditValue", entityBo, "FirstName", true, DataSourceUpdateMode.OnPropertyChanged);
不确定我是否做对了。我相信这一定是一种更好的方式。我真正需要的是某种

UsernameTextEdit.DataBindings.Refresh()
或者类似的,因为控件已经绑定到businessobject属性,所以我只需要让它们再次读取该死的值

有这样的事吗?我错过什么了吗

多谢各位

==============================

我正在发布businessobject模型,尽管我不知道这会有什么帮助,因为它第一次工作正常

=========================== 稍后编辑:

好吧,你知道当你向别人解释你的问题,并在你说话的时候把它弄明白会发生什么吗

在我的例子中是“嘿,我到底在哪里设置BindingSource的数据源?哦,是的,它是在designer中设置的。嗯……如果我再次设置它,而不是删除并添加绑定呢?”猜猜看,效果如何


谢谢大家。

问题在于绑定绑定到一个具体实例,因此必须在实例更改时重新创建

为了允许一次数据绑定设置,您需要一些间接方法-它可以是一个特殊对象,业务对象是一个可选属性(例如,
public UsersBo Current{get;set;}
,因此您可以通过嵌套绑定(如“Current.Name”)绑定到该对象等等,或者使用
BindingSource
组件,如下所示

首先将
BindingSource
组件字段添加到类中:

private BindingSource bindingSource;
然后执行一次性数据绑定设置(在构造函数或加载事件中):

基本上将
entityBo
替换为
bindingSource
。现在,只要您需要选择不同的对象(包括首字母),就可以简单地执行以下操作

bindingSource.DataSource = entityBo;

就这样-数据绑定基础架构将负责其余部分。

发布模型代码。您的模型应该是
INotifyPropertyChanged
您发布的代码中没有证据表明您的模型对象实现了
INotifyPropertyChanged
或为每个p执行
XXXChanged
事件的旧约定属性。当源值更改时,需要一个或另一个属性才能更新绑定的目标。如果这还不足以让您看到问题,则需要修复该问题,使其包含一个可靠地再现该问题的好属性。@PeterDuniho该问题似乎与单个属性绑定无关s、 看起来OP正在询问如何重新绑定到不同的对象实例。对不起,我想我不够清楚。我每次都传递不同的对象,我需要控件来反映新的值。我没有更改当前的businessobject,因此我相信INotifyPropertyChanged不会有帮助。相反,我传递的是一个全新的BO和inform_load我需要控件来显示该对象属性的值。@IvanStoev:没错,谢谢你正确地发现了它。谢谢。非常好而且非常清楚的答案,非常感谢。
bindingSource = new BindingSource();
bindingSource.DataSource = typeof(UsersBo); // to allow binding w/o actual object
// statically bind the controls to the binding source
UsernameTextEdit.DataBindings.Add("EditValue", bindingSource, "Username", true, DataSourceUpdateMode.OnPropertyChanged);
LastNameTextEdit.DataBindings.Add("EditValue", bindingSource, "LastName", true, DataSourceUpdateMode.OnPropertyChanged);
FirstNameTextEdit.DataBindings.Add("EditValue", bindingSource, "FirstName", true, DataSourceUpdateMode.OnPropertyChanged);
bindingSource.DataSource = entityBo;