扩展Binding类以提供可绑定的转换器参数

时间:2014-11-21 17:03:32

标签: wpf xaml ivalueconverter imultivalueconverter

我需要创建一个特定格式的字符串,我使用IMultiValueConverter。例如:

{0} of {1} in {2}
SomeValue0
SomeValue1
SomeValue2

结果:

SomeValue0 of SomeValue1 in SomeValue2

这部分不是问题。基本上转换器接受多个字符串,其中第一个是字符串格式,后面的字符串是要格式化的字符串。

<MultiBinding Converter={...}>
  <Binding>
    <Binding.Source>{0} of {1} in {2}</Binding.Source>
  </Binding>
  <Binding Path="Value0" />
  <Binding Path="Value1" />
  <Binding Path="Value2" />
</MultiBinding>

当某些字符串(Binding)也需要使用IMultiValue转换器时,它会变得棘手。想象一下,属性#Value1#对于不同的语言具有不同的值。通常我们也使用IMultiValueConverter得到这样的值:

<TextBox>
  <TextBox.Text>
    <MultiBinding Converter={...}>
      <Binding Path="Value1"?
      <Binding Path="Strings" Source="{StaticResource langResources}" />
    </MultiBinding>
  </TextBox.Text>
</TextBox>

当用户切换到不同语言时,会更新字符串字典,TextBox会收到新值(这同样适用于将值更改为Value1)。

现在的问题是:在IMultiValueConverter中不可能使用IMultiValueConverter。您也不能覆盖BindingBase的ProvideValue,IMultiValueConverter只接受BindingBase类型的对象。

有什么方法可以以某种方式扩展BindingBase,以便它暴露一个BindableConverterProperty,其值将用于从Binding提供值?

1 个答案:

答案 0 :(得分:0)

  当一些字符串(Binding)也需要使用IMultiValue转换器时,很棘手。

为什么不将字符串的IMultivalue转换器的智能放入一个专门的类中,ToString()将根据当前的环境设置输出正确的字符串?这将消除您所描述的 sub 多值转换器的需要,但需要在父MultiValue转换器的框架内工作。

我推荐的超级字符串类只需要订阅一个事件,通知它使用哪个字典。然后,当调用ToString()时,正确的字符串将传递给顶级转换器。