我正在使用DataBindings.Add方法中的一些的用戶界面控件,如果我用手改變指定UI屬性它的工作原理,或源對象外改變。Winforms DataBinding是否適用於編程改變的屬性?
但是,如果我在代碼調用UI.Property =值,則其不改變UI也不是對DataBindings.Add指定源對象。
我在做什麼錯?我使用不正確?
我正在使用DataBindings.Add方法中的一些的用戶界面控件,如果我用手改變指定UI屬性它的工作原理,或源對象外改變。Winforms DataBinding是否適用於編程改變的屬性?
但是,如果我在代碼調用UI.Property =值,則其不改變UI也不是對DataBindings.Add指定源對象。
我在做什麼錯?我使用不正確?
控制不會知道什麼改變,除非對象實現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
事件之前設置更新的值!這很容易做到,並且可能讓你撓頭,爲什麼價值沒有得到更新。
謝謝,我將搜索如何實現它的文章。 – 2009-10-22 23:49:13
當然,我添加了一個例子。 MSDN也在http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx上討論它。祝你好運。 – 2009-10-22 23:55:33
謝謝尼古拉斯。我有兩個問題:1. PropertyChangedEventArgs可以採取任何類型? 2.這個綁定也允許我改變UI並且更新對象,對嗎? – 2009-10-23 00:04:05