2009-10-22 21 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

相關問題