在WPF表单中编辑货币值

在WPF表单中编辑货币值,wpf,xaml,datagrid,Wpf,Xaml,Datagrid,我在WPF应用程序中遇到了一个奇怪的问题。用户应该在数据网格中输入至少一行的发票。一个字段包含金额,因此看起来像i,ff,即至少有一个数字、一个逗号(我在欧洲)和两个小数位数的整数部分 当用户聚焦到字段时,整型部分可以被覆盖,逗号保持不变,小数部分也可以被覆盖。因此,用户键入整数部分,然后必须使用光标右键跳过逗号,然后键入金额的小数部分 这种行为受到了我的用户的批评,因为他们是会计,并且习惯于一次键入全部金额。所以我的问题是:有没有办法使整个字段可以覆盖 以下是该DataGrid列的XAML:

我在WPF应用程序中遇到了一个奇怪的问题。用户应该在数据网格中输入至少一行的发票。一个字段包含金额,因此看起来像
i,ff
,即至少有一个数字、一个逗号(我在欧洲)和两个小数位数的整数部分

当用户聚焦到字段时,整型部分可以被覆盖,逗号保持不变,小数部分也可以被覆盖。因此,用户键入整数部分,然后必须使用光标右键跳过逗号,然后键入金额的小数部分

这种行为受到了我的用户的批评,因为他们是会计,并且习惯于一次键入全部金额。所以我的问题是:有没有办法使整个字段可以覆盖

以下是该DataGrid列的XAML:

<DataGridTextColumn x:Name="colBetBtto"
    Header="Brutto"
    HeaderStyle="{StaticResource DataGridHeaderRightAligned}"
    Width="*"
    CellStyle="{StaticResource DataGridCellRightAligned}"
    Binding="{Binding Path=BttoBetrag, Mode=TwoWay, StringFormat=N2, UpdateSourceTrigger=PropertyChanged}">
</DataGridTextColumn>

单元样式为:

<Style x:Key="DataGridCellRightAligned" TargetType="DataGridCell">
    <Setter Property="HorizontalContentAlignment" Value="Center" />
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="TextBlock.TextAlignment" Value="Right" />
    <Setter Property="Padding" Value="0,0,1,0" />
</Style>


您知道是什么导致了这种行为吗?

您可以用
DataGridTemplateColumn
替换
DataGridTextColumn
,并将
StringFormat
仅应用于只读
TextBlock

<DataGridTemplateColumn Header="Brutto" CellStyle="{StaticResource DataGridCellRightAligned}" Width="*">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding BttoBetrag, StringFormat=N2}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <TextBox Text="{Binding BttoBetrag}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
编辑2:

我所期望的是用户通过选项卡或单击进入列字段。然后,它的全部内容应该突出显示,用户可以输入一个由数字、逗号和覆盖先前内容的数字组成的量

尝试这样处理事件,然后:

private void dataGrid_GotFocus(object sender, RoutedEventArgs e)
{
    DataGridCell cell = e.OriginalSource as DataGridCell;
    if (cell != null)
    {
        DataGrid dataGrid = sender as DataGrid;
        dataGrid.BeginEdit(e);

        cell.Dispatcher.BeginInvoke(new Action(() =>
        {
            ContentPresenter cp = cell.Content as ContentPresenter;
            if (cp != null && VisualTreeHelper.GetChildrenCount(cp) > 0)
            {
                TextBox textBox = VisualTreeHelper.GetChild(cp, 0) as TextBox;
                if (textBox != null)
                {
                    Keyboard.Focus(textBox);
                    textBox.SelectAll();
                }
            }
        }), System.Windows.Threading.DispatcherPriority.Background);
    }
}
您可能还希望将
StringFormat
应用于
文本框

<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <TextBox Text="{Binding BttoBetrag, StringFormat=N2}" />
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>


mm8再次感谢您的帮助。您建议的解决方案可以在编辑过程中删除逗号,但用户必须在单元格上单击两次才能编辑值。我需要的是,通过制表符序列或单击,整个单元格值被选中并可以更改。请参阅我的编辑。但是如果你有其他问题,请问一个新问题。对不起,mm8,这仍然是同一个问题。我所期望的是用户通过选项卡或单击进入列字段。然后,它的全部内容应该突出显示,用户可以输入一个由数字、逗号和覆盖先前内容的数字组成的量。在我的原始版本中,只选择了小数点之前的金额的整数部分(即逗号)。根据您的建议,没有逗号(因为文本框在CellEditingTemplate中没有格式),但是单元格的内容是未选中的,为了编辑它,用户必须双击它或删除它,这是WinForms中的标准编辑行为,因此,人们习惯了它,并拒绝接受不同的东西…谢谢你mm8。令人沮丧的是,对于简单的标准编辑行为,在WPF中需要大量的额外代码。我怀疑这项技术是否适合商业应用。用户不需要WPF的简单特性,而是需要可靠的标准软件功能。我会再次回到WinForms。
<DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <TextBox Text="{Binding BttoBetrag, StringFormat=N2}" />
    </DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>