2011-06-03 115 views
0

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

问题是,如果SourceUpdateTrigger是PropertyChanged,当用户开始输入时,输入第一个字符后将应用格式,然后将光标定位在刚刚输入的字符之前。这意味着下一个字符将在第一个之前而不是之后输入。如果SourceUpdateTrigger是LostFocus,则用户必须在确认按钮被启用之前将焦点转移到另一个控件,这会在验证货币字段之后发生。

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

我考虑了各种其他选项,包括自定义转换器。这虽然没有奏效,因为我无法解决如何使用ConverterParameter将控件的IsFocused属性公开给转换器。

任何人有任何想法?

回答

0

如何离开UpdateSourceTriggerLostFocus和处理TextChanged关于绑定调用ValidateWithoutUpdate

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>