7

我正在使用 WPF 的 TextBox,并将 Text 属性绑定到我的 ViewModel 上的 double 。

我的 XAML 看起来像这样:

<TextBox Text="{Binding Path=MyDoubleValue, StringFormat=N2, UpdateSourceTrigger=PropertyChanged}" />

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

如何使用 StringFormat 并将 UpdateSourceTrigger 设置为 PropertyChanged?

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

4

1 回答 1

10

通常您不希望UpdateSourceTrigger处于绑定状态,因为这会PropertyChangedTextBox.Text每次按下键时触发验证和更改通知。

如果您这样做只是为了如果用户点击 Enter 它将在处理保存命令之前保存该值,那么我建议挂钩PreviewKeyDown事件并在按下的键为 Enter 时手动更新源(通常我将其设为附加属性)

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>
于 2011-11-18T16:32:54.463 回答