更新绑定到对象[property]的绑定(Binding.IndexerName异常)

0 投票
1 回答
812 浏览
提问于 2025-04-16 12:00

这个问题是从我之前的一个相关问题引出来的。我现在有以下的绑定:

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不支持的东西)

撰写回答