背景 在某些應用中,需要在界面上綁定到索引器,併在值發生變化時實時更新。 解決方案 只要將包含索引器的類實現INotifyPropertyChanged介面,併在索引值更改時引發PropertyChanged事件,並將屬性名稱設置為Item[]即可。示例代碼如下: 在 代碼中,Binding.Ind ...
背景
在某些應用中,需要在界面上綁定到索引器,併在值發生變化時實時更新。
解決方案
只要將包含索引器的類實現INotifyPropertyChanged介面,併在索引值更改時引發PropertyChanged事件,並將屬性名稱設置為Item[]即可。示例代碼如下:
public class NotifyDictionary : INotifyPropertyChanged { private readonly Dictionary<string, string> _dictionary = new Dictionary<string, string>(); public string this[string index] { get { if (_dictionary.ContainsKey(index)) { return _dictionary[index]; } return string.Empty; } set { string oldValue = string.Empty; if (_dictionary.ContainsKey(index)) { oldValue = _dictionary[index]; } _dictionary[index] = value; if (oldValue != value) { OnPropertyChanged(Binding.IndexerName); } } } #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } #endregion INotifyPropertyChanged }
在 代碼中,Binding.IndexerName是一個常量,值即為Item[]。
原理
本質上,索引器也是屬性,即有參屬性。
在WPF的綁定系統中,會監聽屬性更改事件,如果變化的屬性名稱為Item[]而且綁定的是索引器,則會更新界面值。可以看出,這個過程與索引器實際名稱無關係。所以,即使是在索引器上使用IndexerNameAttribute顯式更改索引器名稱也不影響整個過程。
無參屬性綁定冷知識
在WPF綁定系統中,會監聽屬性更改事件。但是如果綁定的屬性為無參屬性(即正常屬性,非索引器),其與變化的屬性名稱比較是不區分大小寫的。所以在下麵的代碼中
private string _name; public string Name { get { return this._name; } set { if (_name != value) { _name = value; this.OnPropertyChanged("naMe"); } } }
name、Name、naMe、naME效果是一樣的。