0

我需要创建一个特定格式的字符串,为此我使用 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>

当某些字符串(绑定)也需要使用 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 提供值?

4

1 回答 1

0

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

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

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

于 2014-11-21T19:11:54.660 回答