C# Winforms数据绑定是否适用于以编程方式更改的属性?
我有一些使用DataBindings.Add方法的UI控件,如果我手动更改指定的UI属性,或者源对象在外部更改,它就会工作 但是如果我在代码中调用UI.Property=值,那么它不会更改为DataBindings.Add指定的UI或源对象C# Winforms数据绑定是否适用于以编程方式更改的属性?,c#,.net,winforms,data-binding,C#,.net,Winforms,Data Binding,我有一些使用DataBindings.Add方法的UI控件,如果我手动更改指定的UI属性,或者源对象在外部更改,它就会工作 但是如果我在代码中调用UI.Property=值,那么它不会更改为DataBindings.Add指定的UI或源对象 我做错了什么?我是否使用不正确?除非对象实现了INotifyPropertyChanged,否则控件不会知道任何更改。然后,更改对象中的属性设置器以引发PropertyChanged事件,并在事件参数中传递更改的属性的名称 INotifyPropertyCh
我做错了什么?我是否使用不正确?除非对象实现了
INotifyPropertyChanged
,否则控件不会知道任何更改。然后,更改对象中的属性设置器以引发PropertyChanged
事件,并在事件参数中传递更改的属性的名称
INotifyPropertyChanged
是WinForms中的数据绑定机制在连接数据绑定时寻找的一个特定接口。如果它看到一个实现该接口的对象,它将订阅它的事件,并且您将看到您的UI自动刷新,而不必告诉数据绑定重新读取它们的值(如果您重新分配数据源
,就会发生这种情况)
不是很明显,但是当你思考的时候,它是有意义的。如果不广播事件,UI控件如何知道属性已更改?它不经常轮询属性。它必须被告知属性已更改,PropertyChanged
事件是执行此操作的常规方式
类似于(未编译代码)
现在,任何与该对象的MyInterestingInt
属性有数据绑定的代码都将在该属性更改时更新自身。(有些人喜欢使用代理为他们实现此接口。)
警告:在引发
PropertyChanged
事件之前,请确保设置了更新的值!这很容易做到,而且可能会让您对为什么不更新该值感到困惑。谢谢,我将搜索有关如何实现它的文章。当然,我添加了一个示例。MSDN也在上讨论了这一点。祝你好运,谢谢你,尼古拉斯。我有两个问题:1。PropertyChangedEventArgs可以采用任何类型?2.此绑定还允许我更改UI并更新对象,对吗?是的,一旦添加(),它将订阅PropertyChanged事件并接收进一步更新。UI将更新对象作为双向数据绑定的一部分。它在以编程方式更改INotifyPropertyChanged解决的属性后更新UI。有意义吗?假设您有一个表单,其中有一个名为“objectInstance”的字段,它是MyInterestingObject的实例。将MyInterestingInt属性数据绑定到某个textbox,比如textbox.DataBindings.Add(新绑定(“Text”,this.objectInstance,“MyInterestingInt”)。因此,如果执行此操作,则.objectInstance.MyInterestingInt=5,则会更新textbox。但是如果您选择this.objectInstance=new MyInterestingObject(),数据绑定仍指向旧引用。您需要清除并重新添加绑定,以侦听新对象上的更改。(可以肯定,已经晚了。)
public class MyInterestingObject : INotifyPropertyChanged
{
private int myInterestingInt;
public event PropertyChangedEventHandler PropertyChanged;
public int MyInterestingInt
{
get { return this.myInterestingInt; }
set
{
if (value != this.myInterestingInt)
{
this.myInterestingInt = value;
this.RaisePropertyChanged("MyInterestingInt");
}
}
}
private void RaisePropertyChanged(string propertyName)
{
var handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}