在 Converter 中访问绑定上下文

Accessing binding context in Converter

在允许用户添加不同对象(如矩形、椭圆、文本、图像等)的绘图应用程序中,我有一个 "color box" 让用户查看或更改所选对象的填充。如果选择了多个对象,我显然不能全部显示,所以我显示第一个选择的对象的颜色。当用户更改 "color box" 的颜色时,我想更改所有选定对象的填充。 (顺便说一句,这也是 VS 属性 window 的工作方式)

如何绑定我的 "color box" 的 Brush 属性(键入 Brush)来执行此操作?

我已经尝试过的是:我将 "color box" 的 Brush 属性 绑定到选择对象,然后使用转换器检查选择对象,如果有一个或其中的多个对象,它 returns Convert() 函数中第一个选定对象的颜色。

然而,问题是我无法实现 ConvertBack(),因为它不允许我访问选择对象,因此我无法遍历所选对象并为它们分配新选择的颜色。

使用 MultiBinding 也没有用,因为 ConvertBack()value 参数是单个对象,我无法访问选择对象。一种想法是使用 ConverterParameter 提供选择对象,但 ConverterParameter is not bindable.

另一个想法(黑客?)是保持一个 class 级别变量指向选择对象并在 Convert() 函数中分配(通过在 MultiBinding 中传递选择对象)然后在 ConvertBack() 中使用该变量,但我不知道它有多安全,也不知道 Convert()ConvertBack() 是否会始终按顺序调用。

那么我该如何实现呢?

好的。事实证明这比我想象的要容易。对于未来的读者,我只是将 属性 添加到我的 Brush 类型的 VM(称之为 SelectionBrush),其 getter 将 return Brush第一个选定的对象,其 setter 将遍历整个选择并将画笔分配给适当的对象(通过检查它们的类型)。不再需要转换器!