使用焦点更改绑定格式

时间:2011-06-03 03:28:48

标签: wpf validation data-binding textbox binding

使用MVVM的WPF应用程序。我有一个TextBox,其Text属性绑定到视图模型的decimal属性。此属性表示货币值。我希望TextBox以货币格式显示数据。为此,我在StringFormat中将Binding设置为“c”。这可以按预期工作。

问题是,如果SourceUpdateTriggerPropertyChanged,当用户开始输入时,在输入第一个字符后应用格式,然后将插入符号放在刚输入的字符之前。这意味着下一个字符将在第一个字符之前而不是之后输入。如果SourceUpdateTriggerLostFocus,则用户必须在启用“确定”按钮之前将焦点切换到另一个控件,这将在验证货币字段后发生。

我希望做的是处理GotFocusLostFocus事件,获取对Binding的引用并更改其StringFormat属性。我对MVVM没有任何问题,因为它纯粹是UI问题。问题是抛出了异常,我被告知Binding在使用后无法更改。

我考虑了其他各种选项,包括自定义转换器。但这没有用,因为我无法弄清楚如何使用ConverterParameter将控件的IsFocused属性暴露给转换器。

有人有什么想法吗?

2 个答案:

答案 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>