更新绑定到object [property]的绑定(Binding.IndexerName怪异)

时间:2011-02-17 15:48:00

标签: python wpf binding ironpython inotifypropertychanged

这来自我的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[]有效。为什么呢?

1 个答案:

答案 0 :(得分:1)

根据this thread Item[index]中的mamadero2,仅适用于Silverlight 4。

(我从来没有想到Silverlight会支持WPF不支持的东西)