我在内容模板中有一些文本的自定义控件:
<ControlTemplate TargetType="{x:Type local:TouchScreenKey}">
<TextBlock><ContentPresenter Content="{TemplateBinding Title, Converter={StaticResource CaseConverter}}" /></TextBlock>
</ControlTemplate>
和自定义IValueConverter CaseConverter - 具有属性UpperCase。因此,当转换器的UpperCase属性设置为true时,它会在绑定时将文本转换为大写。如果我在标记中更改UpperCase,一切都会好起来的。但是,如果我在运行时更改属性 - 没有任何反应 - 因为更改转换器属性不会强制我的控件重新绑定。 如何在转换器属性更改时重新绑定使用转换器的控件?
答案 0 :(得分:0)
据我所知,没有办法告诉转换器更新所有目标。转换器对目标一无所知。它只是一个无状态函数F(x)
,取一个值并返回另一个值。
要更新属性,您应该要求WPF这样做。例如,如果属性绑定到某个源属性,则可以实现INotifyPropertyChanged并触发PropertyChanged
事件。或者,您可以BindingOperations
向get 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)转换第一个参数