在来自 XAML 的静态值转换器上设置依赖属性

Setting dependency properties on a static value converter from XAML

我写了一个值转换器,它允许我绑定 属性,根据给定的(硬编码)值测试 属性,以及 return 画笔基于测试是真还是假。转换器继承自 DependencyObject 并实现 IValueConverter。它公开了两个依赖属性 PositiveBrushNegativeBrush.

我在XAML中这样声明:

<UserControl.Resources>
        <xyz:CBrushConverter x:Key="BrushConverter"
                             PositiveBrush="{DynamicResource Glyph.Resource.Brush.LightGreen}"
                             NegativeBrush="{DynamicResource Glyph.Resource.Brush.DarkGray}" />
</UserControl.Resources>

然后我可以像这样调整给定元素的颜色:

<TextBlock Foreground="{Binding SomeProperty, ConverterParameter='SomeValue', Converter={StaticResource BrushConverter}}" />

所以在这个例子中(假设 SomeProperty return 是一个字符串)如果绑定 属性 'SomeProperty' 匹配 'SomeValue' 转换器将 return PositiveBrush 作为前景(否则它将 return NegativeBrush)。

到目前为止一切顺利 - 可能还有其他方法可以给这只猫剥皮;但这很长一段时间以来对我很有帮助,我真的不想打破常规。

然而,我想做的是将我的 Positive 和 Negative 画笔声明为我的绑定表达式的一部分。现在,如果我想使用 Red/Green 和 Blue/Yellow 颜色组合,我需要声明两个 BrushConverter。但是如果我可以将 Positive/Negative 画笔声明为绑定表达式的一部分,我就可以使用相同的转换器。

在伪代码中,类似这样的东西(显然这不起作用):

<Grid Foreground="{Binding SomeProperty, ConverterParameter='SomeValue', Converter={StaticResource BrushConverter, BrushConverter.PositiveBrush='Red', BrushConverter.NegativeBrush='Green'}}" />

我确实在堆栈上发现了一个类似的问题,How can I set a dependency property on a static resource?但它没有明确解决我的问题。

所以...我的 google-foo 很弱 - 我无法想出正确的搜索词来剖析 Xaml 绑定语法并自己解决这个问题, 如果可能的话。

一如既往,我们将不胜感激!

这应该有效:

<TextBlock>
    <TextBlock.Foreground>
        <Binding Path="SomeProperty" ConverterParameter="SomeValue">
            <Binding.Converter>
                <xyz:CBrushConverter PositiveBrush="Red" NegativeBrush="Green"/>
            </Binding.Converter>
        </Binding>
    </TextBlock.Foreground>
</TextBlock>

但是请注意,您在这里没有将转换器用作静态资源。您将为每个绑定创建一个新的转换器实例。

But if I could declare the Positive/Negative brushes as part of the binding expression, I could use the same converter.

你真的做不到。 Converter 只是 Binding class 的 属性。您仍然需要创建转换器的实例并设置该特定实例的依赖属性。如果您有多个绑定同时使用具有不同 PositiveBrush 和 NegativeBrush 属性值的相同转换器实例怎么办?

不过您可以定义一个内联转换器实例:

<TextBlock>
    <TextBlock.Foreground>
        <Binding Path="SomeProperty" ConverterParameter="SomeValue">
            <Binding.Converter>
                <xyz:CBrushConverter PositiveBrush="Green" NegativeBrush="Red" />
            </Binding.Converter>
        </Binding>
    </TextBlock.Foreground>
</TextBlock>