【发布时间】:2016-02-28 11:20:27
【问题描述】:
我正在尝试使用 WPF 创建一个界面,该界面可以一次显示和修改多个选定对象的属性。我知道这一定是可能的(Visual Studio 中的属性网格可以做到),但我无法找到任何有关如何实现它的信息或示例。我找到了很多关于 MultiBinding 的信息,但它的规范用例似乎是将一个 UI 字段绑定到同一个对象上的多个属性,而我试图做相反的事情 - 将一个 UI 字段绑定到同一个属性在多个对象上。
更明确地说,我想要创建的行为是这样的:
- 如果选择了单个对象,则该对象的属性为 显示
- 如果选择了多个对象,属性将根据以下逻辑显示:
- 如果所有选定对象在该属性中具有相同的值,则显示该值
- 如果所选对象在该属性中具有不同的值,则显示“[Multi]”(或类似)
- 输入值后,所有选定对象的绑定属性都设置为该值。
例如,这是我的一个旧的 WinForms 形式,它做同样的事情,我或多或少地尝试在 WPF 中重新创建它。在那种情况下,我在没有数据绑定的情况下在代码隐藏中处理它,我并不特别热衷于重复这种体验。
选择一项:
选择了几个项目(元素类型、材料和 Beta 角度属性相同,其他不同):
针对我的特定用例的一些其他注意事项:
- 我的应用程序的整个 UI 几乎都需要以这种方式工作, 所以越容易重复越好
- 所选项目的数量可能在 1 到 100000 之间(但通常会在几十个左右 - 如果不会变得无法使用,那么在大量选择时稍微滞后可能是可以的)
- 我希望将几种不同类型的数据设为可编辑,每种数据都有自己的定制界面(即,我实际上并不想要通用的属性网格解决方案)
- 我绑定到的数据类型是在一个单独的、公开可用的库中定义的,我(部分)编写了该库,但其他几个人和项目都在使用该库。因此,如果绝对需要,我可以修改这些类型,但我不想对它们做任何过于激烈的事情。
我目前对如何做到这一点的最佳猜测是使用 MultiBinding(或它的自定义子类),跟踪基础集合中的更改,并以编程方式将绑定到每个对象上的属性添加或删除到MultiBinding Bindings 集合,然后编写一个 IMultiValueConverter 来确定显示值。但是,这似乎有点麻烦,实际上并不是 MultiBindings 的设计目的,而且互联网舆论似乎不赞成使用 MultiBindings,除非在绝对必要的情况下(尽管我不完全确定为什么)。有没有更好/更直接/标准的方法来做到这一点?
【问题讨论】:
-
对我来说听起来很简单。具有专用属性来编辑 ViewModel 中的值并处理多选。然后在每个选定项目的设置器中设置值。 When selection changed you may want to trigger notification of that property, so that getter may provide value to be displayed (not sure which one you want, it can be e.g. average value of all items selected).是的,如果您还没有,请查看 MVVM。
标签: c# .net wpf xaml multibinding