从XAML

时间:2018-02-08 15:38:25

标签: wpf xaml dependency-properties ivalueconverter

我有一个我编写的值转换器,允许我绑定属性,针对给定(硬编码)值测试该属性,并根据测试是真还是假返回画笔。转换器继承自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返回一个字符串)如果绑定属性'SomeProperty'匹配'SomeValue',转换器将返回PositiveBrush作为Foreground(否则它将返回NegativeBrush)。

到目前为止一直很好 - 可能有其他方法可以给这只猫皮肤;但是这对我很有用了很长时间,我真的不想摇摇欲坠。

然而,我想要做的是将我的正面和负面画笔声明为我的绑定表达式的一部分。现在,如果我想使用红色/绿色和蓝色/黄色组合,我需要声明两个BrushConverters。但是,如果我可以将正/负画笔声明为绑定表达式的一部分,我可以使用相同的转换器。

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

<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绑定语法并自行解决这个问题,如果可能的话。

一如既往,感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

这应该有效:

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

但请注意,此处不要将转换器用作静态资源。您将为每个Binding创建一个新的转换器实例。

答案 1 :(得分:1)

  

但是如果我可以将Positive / Negative画笔声明为绑定表达式的一部分,我可以使用相同的转换器。

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

您可以内联定义转换器实例:

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