带有CurrencyFormat和PropertyChanged触发器的TextBox不接受文本权限

时间:2012-03-28 15:21:44

标签: wpf binding textbox currency string-formatting

我在WPF窗口中有TextBox绑定到double类型窗口的依赖项属性(见下文)。每当用户输入TextBox

  1. TextBox为空,或
  2. 选择了所有文字
  3. 错误地接受键入的文本。例如:如果我在这些场景中输入'5',结果文本为“$ 5.00”,但插入符号位于'$'之后的'5'之前。如果我尝试输入“52.1”,我会收到“$ 2.15.00”。

    <Window x:Class="WPF.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="154" Width="240" Name="ThisWindow"
            Background="{StaticResource {x:Static SystemColors.AppWorkspaceBrushKey}}">
        <Grid>
            <TextBox Text="{Binding ElementName=ThisWindow,
                                    Path=Amount,
                                    StringFormat={}{0:c},
                                    UpdateSourceTrigger=PropertyChanged}"
                     VerticalAlignment="Center"
                     HorizontalAlignment="Center"
                     MinWidth="100" />
        </Grid>
    </Window>
    

    如果我删除了UpdateSourceTrigger属性,它会正确键入,但不会保留货币格式。

    有什么想法吗?

1 个答案:

答案 0 :(得分:6)

这是因为它尝试在每次按下字符后应用格式。

作为替代方案,我通常只设置TextBox样式,以便它仅在未编辑时应用格式

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Text" Value="{Binding SomeValue, StringFormat=C}" />
    <Style.Triggers>
        <Trigger Property="IsKeyboardFocusWithin" Value="True">
            <Setter Property="Text" Value="{Binding SomeValue, UpdateSourceTrigger=PropertyChanged}" />
        </Trigger>
    </Style.Triggers>
</Style>