这来自我的related question。我目前有以下绑定:
myBinding = Binding("[foo]")
myBinding.Mode = System.Windows.Data.BindingMode.TwoWay
myBinding.Source = obj
acheckbox.SetBinding(CheckBox.IsCheckedProperty, myBinding)
acheckbox.DataContext = obj
这将关注obj[foo]
。用户界面将更新源 - 我可以选中复选框并更改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[]
有效。为什么呢?
答案 0 :(得分:1)
根据this thread Item[index]
中的mamadero2,仅适用于Silverlight 4。
(我从来没有想到Silverlight会支持WPF不支持的东西)