什么是 Change Notification,为什么它很重要(译)
[我自己嘗試做的翻譯,呵呵]
屬性改變通知(Property Change Notification)
有關Windows窗體數據綁定的最重要的一個概念是,它是由更改通知(change notification)驅動的。也就是說,除非數據源通知Windows窗體數據綁定運行時數據已經發生了改變(通過提供一個更改事件),否則,Windows窗體不會更新一個用戶界面元素(控件)。對于簡單的屬性對屬性的綁定,數據源需要提供一個屬性更改通知,這可以通過提供一個屬性的“屬性名”已更改事件(比如為Customer對象的Name屬性提供NameChanged事件)或者實現“INotifyPropertyChanged”接口,INotifyPropertyChanged是VS 2005中新增的一個接口,它可以與BindingList<T>一起使用來創建可綁定的列表(下面會有描述)
例子:不用更改通知的簡單綁定
/*******************************************************************
?* 設置(使用 Visual Studio 窗體設計器):
?*
?*? 添加一個 Label 控件到窗體Form (label1)
?*? 添加一下代碼到 Form.Load 事件處理方法中
?******************************************************************/
?
CurrentTime currentTime = new CurrentTime();
?
/*******************************************************************
?* 綁定Label.Text (string) 到 CurrentTime.Now
?* 注意: 當“Now”改變時Label控件將不會更新
?* 因為“Now”沒有提供更改通知.
?******************************************************************/
?
Binding binding = new Binding("Text", currentTime, "Now", true);
binding.FormatString = "MM/dd/yyyy hh:MM:ss";
?
this.label1.DataBindings.Add(binding);
?
/***********************************************************************
*設置(使用 Visual Studio 窗體設計器):
*
*? 添加一個新的類文件到你的工程,叫做 "CurrentTime"
*? 添加一下代碼到類的實現中
**********************************************************************/
?
public class CurrentTime
{
??? System.Windows.Forms.Timer????? _timer;
?
??? public CurrentTime()
??? {
??????? /***************************************************************
??????? * 使用一個跟蹤當前時間的計時器
??????? ***************************************************************/
???????
??????? _timer = new System.Windows.Forms.Timer();
?
???? ???/***************************************************************
??????? * 每秒鐘更新一次時間
??????? ***************************************************************/
?
??????? _timer.Interval = 1000;
??????? _timer.Tick += delegate { this.Now = DateTime.Now; };
??????? _timer.Start();
??? }
?
??? /*******************************************************************
??? * 使用一個保存當前時間的變量
??? *******************************************************************/
?
??? private DateTime _now = DateTime.Now;
?
??? /*******************************************************************
??? *沒有更改通知 – 被綁定的控件將不會被更新
??? *******************************************************************/
?
??? public DateTime Now
??? {
??????? get { return _now; }
??????? private set
??????? {
??????? ????if (_now != value)
??????????? {
??????????????? _now = value;
??????????? }
??????? }
??? }
}
例子:含有“屬性”已更改的更改通知的簡單數據綁定
/***********************************************************************
* 設置(使用 Visual Studio 窗體設計器):
* 使用和上面的例子中一樣的窗體,但是改變了 “CurrentTime”類型,為“Now”屬性提供了更改通知
* 這個例子使用“屬性”已更改模式。Label控件的文本在這個例子中將會正確的更新
***********************************************************************/
?
public class CurrentTime
{
??? System.Windows.Forms.Timer????? _timer;
?
??? public CurrentTime()
??? {
??????? /***************************************************************
??????? *使用一個跟蹤當前時間的計時器
??????? ***************************************************************/
???????
??????? _timer = new System.Windows.Forms.Timer();
?
??????? /***************************************************************
??????? *每秒鐘更新一次時間
??????? ***************************************************************/
?
??????? _timer.Interval = 1000;
??????? _timer.Tick += delegate { this.Now = DateTime.Now; };
??????? _timer.Start();
??? }
?
??? /*******************************************************************
??? *使用一個保存當前時間的變量
??? *******************************************************************/
?
??? private DateTime _now = DateTime.Now;
?
??? /*******************************************************************
??? * 屬性更改通知被激發 – 當這個屬性更改時,被綁定的用戶界面元素將會更新
??? * 這里使用的是“屬性”已更改模式
??? *******************************************************************/
?
??? public DateTime Now
??? {
??????? get { return _now; }
??????? private set
??????? {
??? ????????if (_now != value)
??????????? {
??????????????? _now = value;
??????????? ????OnNowChanged(EventArgs.Empty);
??????? ????}
??? ????}
??? }
?
??? /*******************************************************************
??? * 提供一個屬性已更改事件
??? *******************************************************************/
?
??? public event EventHandler NowChanged;
?
??? protected virtual void OnNowChanged(EventArgs e)
??? {
??? ????if (null != NowChanged)
??? ????{
? ??????????NowChanged(this, e);
?? ?????}
??? }
}
例子:含有INotifyPropertyChanged更改通知的簡單數據綁定
/***********************************************************************
*設置(使用 Visual Studio 窗體設計器):
*
* 使用上個例子中一樣的窗體,但使用這個版本的CurrentTime類型做了替換.
*
* 這個例子實現了 System.ComponentModel.INotifyPropertyChanged接口.
* 這個例子中的label的文本也會正確的被更新.
**********************************************************************/
?
using System.ComponentModel;
?
public class CurrentTime : INotifyPropertyChanged
{
??? System.Windows.Forms.Timer????? _timer;
?
??? public CurrentTime()
??? {
??????? /***************************************************************
??????? *使用一個跟蹤當前時間的計時器
??????? ***************************************************************/
???????
??????? _timer = new System.Windows.Forms.Timer();
?
??????? /***************************************************************
??????? *每秒鐘更新一次時間
??????? ***************************************************************/
?
??????? _timer.Interval = 1000;
??????? _timer.Tick += delegate { this.Now = DateTime.Now; };
??????? _timer.Start();
??? }
?
??? /*******************************************************************
??? *使用一個保存當前時間的變量
??? *******************************************************************/
?
??? private DateTime _now = DateTime.Now;
?
??? /*******************************************************************
??? *屬性更改通知被激發 – 當這個屬性更改時,被綁定的用戶界面元素將會更新
??? *
??? * 這里使用 INotifyPropertyChanged 接口
??? *******************************************************************/
?
??? public DateTime Now
??? {
??????? get { return _now; }
??????? private set
??????? {
??????????? if (_now != value)
??????????? {
??????????????? _now = value;
??????????????? OnPropertyChanged(“Now”);
??????? ????}
??????? }
??? }
?
??? /*******************************************************************
??? * 提供 INotifyPropertyChanged.PropertyChanged 事件
??? *******************************************************************/
?
??? public event PropertyChangedEventHandler PropertyChanged;
?
??? protected virtual void OnPropertyChanged(string propertyName)
??? {
??? ????OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
??? }
?
??? protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
??? {
???? ???if (null != PropertyChanged)
??? ????{
???? ???????PropertyChanged(this, e);
???? ???}
??? }
}
?
列表更改通知
當數據源是一個列表的時候(復雜的或簡單的綁定列表),數據源需要通過IbindingList接口提供列表和屬性2個更改通知。列表更改通知用來在一個條目從列表中移除、刪除或者新增到列表的時候通知用戶界面元素。一個列表上的屬性更改通知用來在列表中的某一項上的一個屬性(比如列表的第N個位置上的Customer實例的“Name”屬性)發生更改時通知用戶界面元素。Windows窗體中列表綁定的一個關鍵概念是,IbindingList接口既提供依據列表的更改通知,又提供基于屬性的更改通知。換句話說,這是一個比較關鍵的地方,被綁定到一個列表的Windows窗體控件將不會監聽列表中的項目提供的屬性更改通知,而是,Windows窗體需要列表為它所包含的項目提供這種通知。
在VS 2005之前,實現IBindingList會在列表和列表中所包含的項之間形成強耦合,因為包含的那些項需要在他們發生改變時告訴列表。在VS2005中,這通過引入BindingList<T>和INotifyPropertyChanged接口得到簡化。BindingList<T>是一個IBindingList的泛型實現,它可以自動的將子項的INotifyPropertyChanged事件轉換到IBindingList.ListChanged事件(譯者注:這里有些疑問,為什么不轉換成PropertyChanged事件呢,還需要求證)
注意,如果列表是通過BindingSource綁定的話,那種綁定到一個不是IBindingList的基于列表的數據源的體驗可能會改善很多。
轉載于:https://www.cnblogs.com/Ricky81317/archive/2006/12/25/601015.html
總結
以上是生活随笔為你收集整理的什么是 Change Notification,为什么它很重要(译)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸡肉和什么食物搭配最有营养!
- 下一篇: Regular in UltraEdit