【问题标题】:Setting dependency properties on a static value converter from XAML从 XAML 设置静态值转换器的依赖属性
【发布时间】:2018-02-08 15:38:24
【问题描述】:

我有一个我写的值转换器,它允许我绑定一个属性,根据给定的(硬编码)值测试该属性,并根据测试是真还是假返回一个画笔。转换器继承自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 作为前景(否则它将返回 NegativeBrush)。

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

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

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

<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 绑定语法并自己解决这个问题。

一如既往,感谢您的帮助!

【问题讨论】:

    标签: wpf xaml dependency-properties ivalueconverter


    【解决方案1】:

    这应该可行:

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

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

    【讨论】:

      【解决方案2】:

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

      你真的不能这样做。 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>
      

      【讨论】:

      • 哦,快。我完全没有考虑并发重入。 - 感谢您提出这一点。 - 我认为内联转换器的独特实例会很好地工作。 (我什至不知道该怎么做,所以这很方便)谢谢!
      猜你喜欢
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 2016-12-30
      • 2014-08-14
      相关资源
      最近更新 更多