我有一个带有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没有太大帮助。
答案 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;自动显示在数据网格行的左侧。 然后用户可以编辑他的错误。