2009-10-22 26 views
2

我正在使用DataBindings.Add方法中的一些的用户界面控件,如果我用手改变指定UI属性它的工作原理,或源对象外改变。Winforms DataBinding是否适用于编程改变的属性?

但是,如果我在代码调用UI.Property =值,则其不改变UI也不是对DataBindings.Add指定源对象。

我在做什么错?我使用不正确?

回答

8

控制不会知道什么改变,除非对象实现INotifyPropertyChanged。然后,对象中的属性设置器被更改为引发PropertyChanged事件,并传入在事件参数中更改的属性的名称。

INotifyPropertyChanged是一个特定的接口,在WinForms的数据绑定机制看起来连接最多数据绑定时。如果它看到一个实现了该接口的对象,它将订阅它的事件,并且你将看到你的UI自动刷新,而不必告诉数据绑定重新读取它们的值(这是如果你重新分配DataSource等)。

并不明显,但它是有道理的,当你思考的问题。如果没有事件被广播,UI控件如何知道该属性已经改变?这并不是每隔一段时间都在投票。必须告知该物业已更改,并且PropertyChanged活动是常规方式。

喜欢的东西(未编译的代码)...


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)); 
     } 
    } 
} 

现在有一个数据绑定到该对象的MyInterestingInt属性时更改属性将更新本身的任何代码。 (有些人喜欢用代理为他们实现这个接口。)

一个告诫:确保您在提升PropertyChanged事件之前设置更新的值!这很容易做到,并且可能让你挠头,为什么价值没有得到更新。

+0

谢谢,我将搜索如何实现它的文章。 – 2009-10-22 23:49:13

+1

当然,我添加了一个例子。 MSDN也在http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx上讨论它。祝你好运。 – 2009-10-22 23:55:33

+0

谢谢尼古拉斯。我有两个问题:1. PropertyChangedEventArgs可以采取任何类型? 2.这个绑定也允许我改变UI并且更新对象,对吗? – 2009-10-23 00:04:05

相关问题