在WPF DataGrid中输入时用逗号替换逗号

Pat*_*zer 2 c# wpf xaml datagrid

我有一个带有DataGrid的WPF应用程序,它绑定到ObservableCollection.集合类型是一个类,它包含一个或多个类型为double的属性,用于十进制值.在XAML中,我已经定义了DataGrid-Columns:

<DataGrid.Columns>
    <DataGridTextColumn x:Name="col_LowerBound"
                        Binding="{Binding LowerBound, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"
                        Header="Lower bound"/>
</DataGrid.Columns>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在使用UpdateSourceTrigger LostFocus而不是PropertyChanged.在PropertyChanged的情况下,输入会立即被检查,并且会出现像"."这样的字符.会导致不可信.通过使用LostFocus,我可以用点输入小数.

现在我想输入逗号并用点替换它.我可以在KeyDown-或PreviewKeyDown事件中进行替换以及如何进行替换?我不知道如何更换值,而KeyDown和TextBox的类似情况没有太大帮助.

Pat*_*zer 5

我找到了一个使用转换器类的真正简单的解决方案.

首先,我们需要一个转换器类,用点替换输入中的任何逗号.笑话是我们必须在Convert方法和ConvertBack方法中进行相同的替换.:d

using System;
using System.Globalization;
using System.Windows.Data;

namespace P16_StepFunctions
{
    /// <summary>
    /// Class for replacing comma by dot in input of decimal fields.
    /// </summary>
    public class DecimalConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value.ToString().Replace(",", ".");
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value.ToString().Replace(",", ".");
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

然后我们在窗口的XAML中添加一个资源到转换器类,如下所示:

<Window.Resources>
    <local:DecimalConverter x:Key="decimalconverter"/>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

最后,我们将一个Converter-attribute添加到所有datagrid列的绑定中,这些列应包含十进制值.此属性将转换器作为staticresource获取.

<DataGridTextColumn x:Name="col_LowerBound"
                    Binding="{Binding LowerBound, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=LostFocus, Converter={StaticResource decimalconverter}}"
                    Header="Lower bound"/>
Run Code Online (Sandbox Code Playgroud)

就这样.在键入其中一个datagrid单元格时,在光标离开单元格后,逗号将被点替换.如果输入错误如"1,1,1",则单元格会出现红色边框并出现错误符号"!" 自动显示在数据网格行的左侧.然后用户可以编辑他的错误.