[C#] 資料繫結 (Data Binding)(三) 屬性變更通知
Introduction
當連結的資料來源的值持續改變時,我們該如何通知控制項更新資料。
我們必須通知表單資料執行階段資料來源已經變更,否則表單不會更新控制項,解決的方法就是撰寫事件。
Examples
因為抓圖無法顯示出更新控制項的效果,可以直接參考程式碼。
UI 介面偕統一
sample1 不會更新控制項
CurrentTime.cs
public class CurrentTime {
internal System.Windows.Forms.Timer _timer;
private DateTime _now = DateTime.Now;
public CurrentTime() {
//**************************************************************
// 使用一個 Timer 物件來追蹤目前的計時器。
//**************************************************************
_timer = new System.Windows.Forms.Timer();
_timer.Tick += new EventHandler(_timer_Tick);
//**************************************************************
// 每秒更新時間一次。
//**************************************************************
_timer.Interval = 1000;
_timer.Start();
}
public DateTime Now {
get {
return _now;
}
set {
if ((_now != value)) {
_now = value;
}
}
}
void _timer_Tick(object sender, EventArgs e) {
this.Now = DateTime.Now;
}
}
Form1.cs
private void Form1_Load(object sender, EventArgs e) {
CurrentTime oCurrentTime = new CurrentTime();
// 將 txtTime 控制項的 Text 屬性繫結至 oCurrentTime 物件的 Now 屬性。
Binding myBinding = new Binding("Text", oCurrentTime, "Now", true);
myBinding.FormatString = "yyyy/MM/dd hh:mm:ss";
this.txtTime.DataBindings.Add(myBinding);
}
sample2 自訂事件通知資料來源已經變更
CurrentTimeEvent.cs
public class CurrentTimeEvent {
internal System.Windows.Forms.Timer _timer;
private DateTime _now = DateTime.Now;
public CurrentTimeEvent() {
//**************************************************************
// 使用一個 Timer 物件來追蹤目前的計時器。
//**************************************************************
_timer = new System.Windows.Forms.Timer();
_timer.Tick += new EventHandler(_timer_Tick);
//**************************************************************
// 每秒更新時間一次。
//**************************************************************
_timer.Interval = 1000;
_timer.Start();
}
public DateTime Now {
get {
return _now;
}
set {
if ((_now != value)) {
_now = value;
//觸發事件
OnNowChanged(EventArgs.Empty);
}
}
}
void _timer_Tick(object sender, EventArgs e) {
this.Now = DateTime.Now;
}
//*******************************************************************
// 提供一個 "Property"Changed 事件。
//*******************************************************************
public event EventHandler NowChanged;
protected void OnNowChanged(EventArgs e) {
if (NowChanged != null) {
NowChanged(this, e);
}
}
}
Form2.cs
private void Form2_Load(object sender, EventArgs e) {
CurrentTimeEvent oCurrentTimeEvent = new CurrentTimeEvent();
// 將 txtTime 控制項的 Text 屬性繫結至 oCurrentTimeEvent 物件的 Now 屬性。
Binding myBinding = new Binding("Text", oCurrentTimeEvent, "Now", true);
myBinding.FormatString = "yyyy/MM/dd hh:mm:ss";
this.txtTime.DataBindings.Add(myBinding);
}
sample3 繼承 INotifyPropertyChanged 介面通知屬性變更
CurrentTimeINotifyPropertyChanged.cs
//引入命名空間
using System.ComponentModel;
namespace TestBindingProperty {
public class CurrentTimeINotifyPropertyChanged : INotifyPropertyChanged{
internal System.Windows.Forms.Timer _timer;
private DateTime _now = DateTime.Now;
public CurrentTimeINotifyPropertyChanged() {
//**************************************************************
// 使用一個 Timer 物件來追蹤目前的計時器。
//**************************************************************
_timer = new System.Windows.Forms.Timer();
_timer.Tick += new EventHandler(_timer_Tick);
//**************************************************************
// 每秒更新時間一次。
//**************************************************************
_timer.Interval = 1000;
_timer.Start();
}
public DateTime Now {
get {
return _now;
}
set {
if ((_now != value)) {
_now = value;
//觸發事件
OnPropertyChanged("Now");
}
}
}
void _timer_Tick(object sender, EventArgs e) {
this.Now = DateTime.Now;
}
#region INotifyPropertyChanged 成員
//*******************************************************************
// 提供一個 INotifyPropertyChanged.PropertyChanged 事件。
//*******************************************************************
public event PropertyChangedEventHandler PropertyChanged;
#endregion
protected void OnPropertyChanged(string propertyName) {
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
protected void OnPropertyChanged(PropertyChangedEventArgs e) {
if (PropertyChanged != null) {
PropertyChanged(this, e);
}
}
}
}
Form3.cs
private void Form3_Load(object sender, EventArgs e) {
CurrentTimeINotifyPropertyChanged oCurrentTimeINotify = new CurrentTimeINotifyPropertyChanged();
// 將 txtTime 控制項的 Text 屬性繫結至 oCurrentTimeINotify 物件的 Now 屬性。
Binding myBinding = new Binding("Text", oCurrentTimeINotify, "Now", true);
myBinding.FormatString = "yyyy/MM/dd hh:mm:ss";
this.txtTime.DataBindings.Add(myBinding);
}
Reference
三小俠 小弟獻醜,歡迎指教