常常寫用一個TextBox顯示某個對象,而後編輯以後再保存的程序。之前都是在TextBox_TextChanged事件中修改對象的值,或者保存的時候再讀取TextBox.Text屬性保存對象的值。這樣比較麻煩,並且常常容易出錯。後來瞭解了C#的數據綁定,發現可以很好的解決這個問題。this
1. 首先C#的TextBox自己就帶數據綁定功能。spa
下面的代碼就是把_myData對象的"TheValue"屬性綁定到textBox1和textBox2的"Text"屬性。最後一個參數不一樣:雙向綁定
1)其中DataSourceUpdateMode.OnPropertyChanged表示textBox1.Text發生變化,_myData.TheValue也變化,叫雙向綁定。code
2)DataSourceUpdateMode.Never表示Text1.Text變化不影響_myData.TheValue的值,是單向綁定。orm
private void Form1_Load(object sender, EventArgs e) { _myData = new MyData(); textBox1.DataBindings.Add("Text", _myData, "TheValue", false, DataSourceUpdateMode.OnPropertyChanged); textBox2.DataBindings.Add("Text", _myData, "TheValue", false, DataSourceUpdateMode.Never); }
2.也許有人留意到了,爲何上面的叫"雙向綁定"呢?若是_myData.TheValue的值變化了,兩個文本框的Text會變化嗎?不錯,僅在 textBox上數據綁定還不叫雙向綁定,對象數據變化要通知綁定該對象的控件才行。這樣就須要對象實現INotifyPropertyChanged接 口。對象
public class MyData : INotifyPropertyChanged { private string _theValue = string.Empty; public string TheValue { get { return _theValue; } set { if (string.IsNullOrEmpty(value) && value == _theValue) return; _theValue = value; NotifyPropertyChanged(() => TheValue); } } public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged<T>(Expression<Func<T>> property) { if (PropertyChanged == null) return; var memberExpression = property.Body as MemberExpression; if (memberExpression == null) return; PropertyChanged.Invoke(this, new PropertyChangedEventArgs(memberExpression.Member.Name)); } }
3.好了,數據綁定完成了,看看效果吧。textBox1.Text變化—>_myData.TheValue變化—>textBox2.Text變化。反過來textBox2.Text變化就不是這樣了,由於textBox2使用的單向綁定。blog