在 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 将遍历整个选择并将画笔分配给适当的对象(通过检查它们的类型)。不再需要转换器!
在允许用户添加不同对象(如矩形、椭圆、文本、图像等)的绘图应用程序中,我有一个 "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 将遍历整个选择并将画笔分配给适当的对象(通过检查它们的类型)。不再需要转换器!