IValueConverter或重新绑定控件的依赖属性?

时间:2010-02-26 07:45:12

标签: wpf text binding case ivalueconverter

我在内容模板中有一些文本的自定义控件:

<ControlTemplate TargetType="{x:Type local:TouchScreenKey}">    
    <TextBlock><ContentPresenter Content="{TemplateBinding Title, Converter={StaticResource CaseConverter}}" /></TextBlock>
</ControlTemplate>

和自定义IValueConverter CaseConverter - 具有属性UpperCase。因此,当转换器的UpperCase属性设置为true时,它会在绑定时将文本转换为大写。如果我在标记中更改UpperCase,一切都会好起来的。但是,如果我在运行时更改属性 - 没有任何反应 - 因为更改转换器属性不会强制我的控件重新绑定。 如何在转换器属性更改时重新绑定使用转换器的控件?

2 个答案:

答案 0 :(得分:0)

据我所知,没有办法告诉转换器更新所有目标。转换器对目标一无所知。它只是一个无状态函数F(x),取一个值并返回另一个值。

要更新属性,您应该要求WPF这样做。例如,如果属性绑定到某个源属性,则可以实现INotifyPropertyChanged并触发PropertyChanged事件。或者,您可以BindingOperationsget binding expression提问,并手动调用UpdateTarget()

也许转换器不是这里的最佳选择?您可能还想考虑使用Attached Properties来更改大小写。

答案 1 :(得分:0)

它可以帮助某人 - 我找到解决方案 - 使用多重绑定

<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center">
<ContentPresenter>
    <ContentPresenter.Content>
        <MultiBinding Converter="{StaticResource MultiCaseConverter}">
            <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Title" />
            <Binding ElementName="TouchKeyboard" Path="UpperCase" />
        </MultiBinding>
    </ContentPresenter.Content>
</ContentPresenter>

并编写了MultiCaseConverter - 它根据第二个(UpperCase)转换第一个参数