2014-11-21 43 views
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> 

当一些字符串(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提供值?

回答

0

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

为什么不把字符串的IMultivalue转换器的智能转化为专门的班级谁是ToString()将输出基于当前的环境设置正确的字符串?这将消除您所描述的多值转换器的需求,但是可以在父MultiValue转换器的框架内工作。

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

+0

让我们假设我使用IValueConverter,在那里我返回本地化为当前语言的字符串。这意味着我们不需要将字典传递给绑定。但是,如果语言(字典)更改,那么绑定显示的值将如何更改? – Goran 2014-11-21 22:34:05

+0

@Goran你需要通过订阅'System.Windows.Input.InputLanguageManager.Current.InputLanguageChanged'来检测语言的变化,然后调用一个PropertyChanged更新来控制哪些会受到影响,比如'OnPropertyChanged(new PropertyChangedEventArgs(string.Empty) );'。 – OmegaMan 2014-11-21 23:55:57

+0

..这是我想避免的一些问题,因为它导致了混乱的代码和无声的错误。试想几百行我为每个受影响的属性调用OnPropertyChanged方法。我试图找到一种方法,在查看UI xaml时,明确了解哪些属性依赖于哪些值。 – Goran 2014-11-22 02:04:45