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

时间:2017-01-24 15:12:15

标签: 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>

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

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

1 个答案:

答案 0 :(得分: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(",", ".");
        }

    }
}

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

<Window.Resources>
    <local:DecimalConverter x:Key="decimalconverter"/>
</Window.Resources>

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

<DataGridTextColumn x:Name="col_LowerBound"
                    Binding="{Binding LowerBound, NotifyOnTargetUpdated=True, Mode=TwoWay, UpdateSourceTrigger=LostFocus, Converter={StaticResource decimalconverter}}"
                    Header="Lower bound"/>

这就是全部。 在键入其中一个datagrid单元格时,在光标离开单元格后,逗号将被点替换。 如果输入错误,例如&#34; 1,1,1&#34;单元格有一个红色边框和一个错误标志&#34;!&#34;自动显示在数据网格行的左侧。 然后用户可以编辑他的错误。