【发布时间】:2012-02-03 13:09:16
【问题描述】:
我有一个 TextBox 样式,如果框没有聚焦,它会格式化一个数字,但在编辑它时会留下未格式化的数字。
这是我想要的多个文本框的样式,但它们都包含不同的文本绑定。常规 Text setter 和 Triggered Text setter 之间的唯一区别是 Triggered 的绑定中有StringFormat=N2。
有没有办法可以使这种样式通用,例如只更改 DataTrigger 中绑定的StringFormat 属性?
<TextBox>
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Text" Value="{Binding SomeValue, StringFormat=N2, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="Text" Value="{Binding SomeValue, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
【问题讨论】:
-
我认为绑定的任何属性在应用后都无法更改。至少当我尝试更改现有绑定的 StringFormat 属性时,我得到一个 InvalidOperationException 说
Binding cannot be changed after it has been used.在我看来,每次焦点更改时都无法创建新绑定。 -
再次考虑这一点,并考虑了某种附加的
Data属性解决方案,其中属性更改处理程序将附加 GotFocus/LostFocus 处理程序等。最后我更希望有一个派生的 TextBox属性Data和StringFormat,将根据它们的值和当前焦点状态设置Text属性。
标签: wpf xaml data-binding styles