使用MVVM的WPF应用程序。我有一个TextBox
,其Text
属性绑定到视图模型的decimal
属性。此属性表示货币值。我希望TextBox
以货币格式显示数据。为此,我在StringFormat
中将Binding
设置为“c”。这可以按预期工作。
问题是,如果SourceUpdateTrigger
是PropertyChanged
,当用户开始输入时,在输入第一个字符后应用格式,然后将插入符号放在刚输入的字符之前。这意味着下一个字符将在第一个字符之前而不是之后输入。如果SourceUpdateTrigger
为LostFocus
,则用户必须在启用“确定”按钮之前将焦点切换到另一个控件,这将在验证货币字段后发生。
我希望做的是处理GotFocus
和LostFocus
事件,获取对Binding
的引用并更改其StringFormat
属性。我对MVVM没有任何问题,因为它纯粹是UI问题。问题是抛出了异常,我被告知Binding
在使用后无法更改。
我考虑了其他各种选项,包括自定义转换器。但这没有用,因为我无法弄清楚如何使用ConverterParameter
将控件的IsFocused
属性暴露给转换器。
有人有什么想法吗?
答案 0 :(得分:0)
如何将UpdateSourceTrigger
留在LostFocus
并处理TextChanged
来约束ValidateWithoutUpdate
绑定?
答案 1 :(得分:0)
您可以使用数据模板中的数据触发器动态更改文本框的绑定。
<DataTemplate x:Key="DataTemplate1">
<TextBox x:Name="TheTextBox"
Text="{Binding Path=ThePropertyPath, StringFormat={}{0:p0}, UpdateSourceTrigger=PropertyChanged}" />
<DataTemplate.Triggers>
<!-- Set the TextBox.Text Binding but this time leave the StringFormat off -->
<DataTrigger Binding="{Binding Path=IsKeyboardFocusWithin, ElementName=TheTextBox}" Value="True">
<Setter TargetName="TheTextBox" Property="Text" Value="{Binding Path=ThePropertyPath, UpdateSourceTrigger=PropertyChanged}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsFocused, ElementName=TheTextBox}" Value="True">
<Setter TargetName="TheTextBox" Property="Text" Value="{Binding Path=ThePropertyPath, UpdateSourceTrigger=PropertyChanged}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>