我需要创建一个特定格式的字符串,为此我使用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接收到新的值(同样适用于改变值值1)。
现在的问题是:在IMultiValueConverter里面不可能使用IMultiValueConverter。您也无法为BindingBase重写ProvideValue,并且IMultiValueConverter将只接受BindingBase类型的对象。
有没有什么办法可以以某种方式扩展BindingBase,以便它公开一个BindableConverterProperty,它的值将用于从Binding提供值?
让我们假设我使用IValueConverter,在那里我返回本地化为当前语言的字符串。这意味着我们不需要将字典传递给绑定。但是,如果语言(字典)更改,那么绑定显示的值将如何更改? – Goran 2014-11-21 22:34:05
@Goran你需要通过订阅'System.Windows.Input.InputLanguageManager.Current.InputLanguageChanged'来检测语言的变化,然后调用一个PropertyChanged更新来控制哪些会受到影响,比如'OnPropertyChanged(new PropertyChangedEventArgs(string.Empty) );'。 – OmegaMan 2014-11-21 23:55:57
..这是我想避免的一些问题,因为它导致了混乱的代码和无声的错误。试想几百行我为每个受影响的属性调用OnPropertyChanged方法。我试图找到一种方法,在查看UI xaml时,明确了解哪些属性依赖于哪些值。 – Goran 2014-11-22 02:04:45