Способ работает в любых контролах ввода текста, разберёмся на примере 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?