使用TextBox上的StringFormat绑定到double

baa*_*mon 6 .net c# wpf .net-4.0 wpf-4.0

我正在使用WPF的TextBox,将Text属性上的绑定设置为ViewModel上的double.

我的XAML看起来像这样:

<TextBox Text="{Binding Path=MyDoubleValue, StringFormat=N2, UpdateSourceTrigger=PropertyChanged}" />
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我将UpdateSourceTrigger切换到PropertyChanged并输入值时12345,我得到12,354.00(编辑:注意4之前的5).这是在.NET格式化程序,之间添加2和之后将光标保持在同一位置的结果3.

如何将StringFormat与UpdateSourceTrigger一起设置为PropertyChanged?

注意:这只发生在.NET 4中.

Rac*_*hel 9

通常你不想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();
    }
}
Run Code Online (Sandbox Code Playgroud)

但话虽如此,如果您仍想使用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>
Run Code Online (Sandbox Code Playgroud)

  • 出于某种原因,使用这个解决方案,如果我在空白的`TextBox`中键入"2.5",我得到"25",小数就不会出现.如果我将光标重新定位到除右下方的任何位置,那么我可以键入小数. (4认同)