2017-01-24 6 views
1

У меня есть приложение WPF с DataGrid, связанным с ObservableCollection. Тип коллекции - это класс, который содержит одно или несколько свойств типа double для десятичных значений. В XAML я определил DataGrid-столбцы, как, что:Заменить запятую точкой во время ввода в WPF DataGrid

<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

Возможный дубликат [Можете ли вы заменить символы в текстовом поле при вводе?] (Http://stackoverflow.com/questions/18971198/can-you-replace-characters-in-a-textbox-as-you- тип). У вас действительно есть правильная идея, этот вопрос и его ответы должны дать вам все понимание, которое вам нужно для этого. – Kilazur

+0

Здравствуйте, Килазур. Спасибо за подсказку, но, к сожалению, TextBox не совпадает с DataGrid и его ячейками. Тем временем я нашел лучшее решение, используя конвертер, который вы можете посмотреть ниже. –

+0

Вы заметите, что один из ответов говорит об использовании конвертера: p – Kilazur

ответ

3

Я нашел настоящее и простое решение, которое использует класс преобразователя.

Для начала нам нужен класс преобразователя, который заменяет любую запятую на входе точкой. Шутка в том, что мы должны сделать ту же замену в методе 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> 

И, наконец, мы добавим конвертер-атрибут для связывания всех DataGrid колонн, должны содержать десятичные значения. Этот атрибут получает преобразователь как staticresource.

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

И все. При вводе в одну из этих ячеек таблицы данных запятые заменяются точками после того, как курсор покинул ячейку. В случае неправильного ввода, например «1,1,1», ячейка получает красную рамку и знак ошибки «!». автоматически отображается в левой части строки datagrid. Тогда пользователь может отредактировать свою ошибку.