我正在使用WPF的TextBox,将Text属性绑定到我的ViewModel上的double。
我的XAML看起来像这样:
<TextBox Text="{Binding Path=MyDoubleValue, StringFormat=N2, UpdateSourceTrigger=PropertyChanged}" />
不幸的是,当我将UpdateSourceTrigger切换到PropertyChanged并输入值12345
时,我得到12,354.00
(编辑:注意4之前的5)。这是在.NET格式化程序在,
和2
之间添加3
后将光标保持在同一位置的结果。
如何将StringFormat与UpdateSourceTrigger一起设置为PropertyChanged?
注意:这只发生在.NET 4中。
答案 0 :(得分:8)
通常您不希望UpdateSourceTrigger
在PropertyChanged
绑定上TextBox.Text
,因为每次按下某个键都会触发验证和更改通知。
如果你这样做只是为了如果用户点击Enter它将在处理save命令之前保存该值,然后我建议挂钩PreviewKeyDown
事件并在按下键时手动更新源是Enter(通常我把它变成一个AttachedProperty)
private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
var obj = sender as UIElement;
BindingExpression textBinding = BindingOperations.GetBindingExpression(
obj, TextBox.TextProperty);
if (textBinding != null)
textBinding.UpdateSource();
}
}
但话虽如此,如果您仍想使用UpdateSourceTrigger=PropertyChanged
,请考虑在显示值时使用格式,但在用户编辑时将其删除。
<TextBox>
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Text" Value="{Binding Path=MyDoubleValue, StringFormat=N2}" />
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Text" Value="{Binding Path=MyDoubleValue, UpdateSourceTrigger=PropertyChanged}" />
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>