Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Winforms数据绑定是否适用于以编程方式更改的属性?_C#_.net_Winforms_Data Binding - Fatal编程技术网

C# Winforms数据绑定是否适用于以编程方式更改的属性?

C# Winforms数据绑定是否适用于以编程方式更改的属性?,c#,.net,winforms,data-binding,C#,.net,Winforms,Data Binding,我有一些使用DataBindings.Add方法的UI控件,如果我手动更改指定的UI属性,或者源对象在外部更改,它就会工作 但是如果我在代码中调用UI.Property=值,那么它不会更改为DataBindings.Add指定的UI或源对象 我做错了什么?我是否使用不正确?除非对象实现了INotifyPropertyChanged,否则控件不会知道任何更改。然后,更改对象中的属性设置器以引发PropertyChanged事件,并在事件参数中传递更改的属性的名称 INotifyPropertyCh

我有一些使用DataBindings.Add方法的UI控件,如果我手动更改指定的UI属性,或者源对象在外部更改,它就会工作

但是如果我在代码中调用UI.Property=值,那么它不会更改为DataBindings.Add指定的UI或源对象


我做错了什么?我是否使用不正确?

除非对象实现了
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));
        }
    }
}