在来自 XAML 的静态值转换器上设置依赖属性
Setting dependency properties on a static value converter from XAML
我写了一个值转换器,它允许我绑定 属性,根据给定的(硬编码)值测试 属性,以及 return 画笔基于测试是真还是假。转换器继承自 DependencyObject
并实现 IValueConverter
。它公开了两个依赖属性 PositiveBrush
和 NegativeBrush
.
我在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>
我写了一个值转换器,它允许我绑定 属性,根据给定的(硬编码)值测试 属性,以及 return 画笔基于测试是真还是假。转换器继承自 DependencyObject
并实现 IValueConverter
。它公开了两个依赖属性 PositiveBrush
和 NegativeBrush
.
我在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>