更新绑定到对象[property]的绑定(Binding.IndexerName异常)
这个问题是从我之前的一个相关问题引出来的。我现在有以下的绑定:
myBinding = Binding("[foo]")
myBinding.Mode = System.Windows.Data.BindingMode.TwoWay
myBinding.Source = obj
acheckbox.SetBinding(CheckBox.IsCheckedProperty, myBinding)
acheckbox.DataContext = obj
这个绑定会查看 obj[foo]
。用户界面(UI)会正常更新数据源——我可以勾选复选框,obj[foo]
的值会改变。但是反过来就不行了。在代码中改变 obj[foo]
的值并不会更新用户界面,即使我手动调用了 OnPropertyChanged
:
obj[foo] = False
obj._OnPropertyChanged(obj, System.ComponentModel.PropertyChangedEventArgs("[foo]"))
问题可能出在 OnPropertyChanged
的参数上。经过一些调查(还有 H.B. 的帮助),我发现了这篇文章:
http://10rem.net/blog/2010/03/08/wpf---silverlight-quick-tip-inotifypropertychanged-for-indexer
如果你正在为这些创建数据源(例如,你在构建自己的 ObservableDictionary),你可能会想知道如何触发合适的
INotifyPropertyChanged.PropertyChanged
事件,以便让绑定系统知道那个字段名或索引的项已经改变。绑定系统在寻找一个名为
"Item[]"
的属性,这个属性是由常量字符串Binding.IndexerName
定义的。
换句话说,Binding.IndexerName
是一个常量 "Item[]"
,它告诉绑定引擎重新扫描整个源字典。
obj._OnPropertyChanged(obj, System.ComponentModel.PropertyChangedEventArgs(Binding.IndexerName))
# equivalent to:
obj._OnPropertyChanged(obj, System.ComponentModel.PropertyChangedEventArgs("Item[]"))
不幸的是,在我的代码中,扫描整个源字典是一个代价很高的操作;所以那篇文章还提到使用 "Item[foo]"
作为参数。这正是我需要的——但它不管用!只有 Item[]
有效。为什么呢?
1 个回答
1
根据mamadero2在这个讨论帖中说,Item[index]
这个用法只在Silverlight 4中有效。
(我从来没想到Silverlight会支持一些WPF不支持的东西)