Ввод дробных числа с запятой вместо точки в DataGrid WPF и других контролах

Способ работает в любых контролах ввода текста, разберёмся на примере DataGrid. По умолчанию DataGrid не даст ввести дробное число «по-русски», то есть, формата «123,45», в ячейку с прибинденным значением типа float, decimal и т. п. Это происходит потому, что русскоязычный формат разделителя не соответствует формату «по умолчанию», то есть, разделитель точка.

Для решения проблемы необходимо создать конвертер:

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

/// <summary>
/// Заменяем запятую на точку при вводе десятичных чисел в DataGrid.
/// </summary>
class DecimalConverter : IValueConverter 
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
            return value.ToString().Replace(",", ".");
        else return null;
    }

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

}

Далее, в ресурсах окна/страницы:

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

Теперь, чтобы запятая при вводе не съедалась, нам необходимо прикрутить конвертер:

<DataGridTextColumn 
    Header="Десятичная ячейка" 
    Binding="{Binding DecimalValue, Mode=TwoWay, UpdateSourceTrigger=LostFocus, Converter={StaticResource decimalconverter}}" />
<!-- ИЛИ -->
<TextBox 
    Text="{Binding DecimalValue, Mode=TwoWay, UpdateSourceTrigger=LostFocus, Converter={StaticResource decimalconverter}}" />

Обратите внимание на UpdateSourceTrigger=LostFocus. Если оставить живое обновление свойства, то эффекта никакого не будет.

На этом всё. Спасибо за внимание!

Ввод дробных числа с запятой вместо точки в DataGrid WPF и других контролах: 1 комментарий

  1. а как сделать, чтобы этот конвертер работал сразу для всех столбцов DataGrid?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.