如何在多绑定中某一子绑定变更时重新评估所有子绑定?
var binding1 = new Binding($"Item[0].IsChecked") { Source = sender, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, ConverterParameter = dependant }; var binding2 = new Binding($"Item") { Source = sender, Converter = new AllItemsAreEqualConverter(), ConverterParameter = dependant }; var multiBinding = new MultiBinding { Bindings = { binding1, binding2 }, Converter = unifyingConverter };
我的模型实现了INotifyPropertyChanged接口,修改IsChecked属性时,binding1会按预期重新评估,但此时binding2的结果也应该发生变化。我希望多绑定能在某一子绑定变更时重新评估所有子绑定,是否可行?
补充背景:
我在Telerik属性网格中同时编辑多个对象,思路是让第一个绑定在IsChecked属性的PropertyChanged通知触发时重新评估绑定状态,第二个绑定检查所有选中模型的同一属性,最终通过multibinding中的unifyingConverter将两个子绑定的值转换为Visibility,用于控制特定属性定义的可见性。
可行,推荐两种实现方式:
手动触发集合通知
binding2绑定的是Item集合,单个元素的IsChecked变更不会触发集合本身的PropertyChanged通知。你可以在模型的IsChecked属性setter中,让ViewModel触发Item集合的PropertyChanged事件(比如调用OnPropertyChanged(nameof(Item)))。这样当binding1因IsChecked更新时,binding2会因为集合的通知重新评估。自定义MultiBinding强制刷新
继承MultiBinding类,重写相关方法,当任意子绑定值变化时,强制触发所有子绑定的重新评估。不过这种方式代码量更大,优先级低于第一种方案。
额外注意:如果Item是ObservableCollection,要确保集合内每个元素都正确实现INotifyPropertyChanged,且IsChecked变更时触发通知;同时AllItemsAreEqualConverter要能正确处理集合元素的属性变化,返回准确结果。
内容的提问来源于stack exchange,提问作者atsjoo

