0

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

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

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

4

2 回答 2

0

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

要更新属性,您应该要求 WPF 这样做。例如,如果属性绑定到某个源属性,您可以实现INotifyPropertyChanged并触发PropertyChanged事件。或者您可以要求BindingOperations获取绑定表达式,并手动调用UpdateTarget()

也许转换器不是这里的最佳选择?您可能还需要考虑使用附加属性来更改大小写。

于 2010-02-26T09:30:17.250 回答
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 - 它转换第一个参数取决于第二个(大写)

于 2010-02-26T09:39:19.793 回答