在我们的项目中,我们有一个绑定到双精度的 WPF 文本框。有一个转换器允许在转换回中例如同时使用“.”。和“,”作为小数点,并在转换方法中将双精度格式化为 n2 数字格式。在这里您可以看到我们转换器的简化版本:
public class DoubleConverter:IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null || value.GetType() != typeof(double))
return null;
else
return ((double)value).ToString("n2");
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return null
else
return Double.Parse(((string)value).Replace('.',','));
}
}
文本框如下所示:
<TextBox Text="{Binding Path=Factor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" Width="500" Height="50" />
并且双重属性引发了一个 propertychanged 事件:
public double Factor
{
get { return _factor; }
set
{
_factor = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Factor"));
}
}
这在以前版本的 WPF 中可以正常工作,因为在输入文本时没有调用转换。这种行为显然已经改变,现在在每个文本条目上调用转换方法,导致在您键入内容时对双精度进行格式化。即使您不使用格式化,您也会遇到无法输入小数点的问题。
这可以通过不使用 UpdateSourceTrigger=Propertychanged 来解决,但我们需要它进行验证。我们使用 IDataErrorInterface 实现验证。我知道有一个ValidateWithoutUpdate 方法,但这不适用于使用 IDataErrorInterface 进行验证。
所以我基本上需要的是ConvertBack(以及验证)发生OnPropertyChanged,而Convert只发生OnLostFocus。
这可能吗?或者我们的问题有其他解决方案吗?