在我们的项目中,我们有一个绑定到double的WPF文本框。有一个转换器允许在转换中使用例如“。”。和“,”作为小数点,在转换方法中,它将double格式化为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" />
double属性引发了propertychanged事件:
public double Factor
{
get { return _factor; }
set
{
_factor = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Factor"));
}
}
这曾经在以前的WPF版本中正常工作,因为在输入文本时没有调用转换。此行为显然已更改,现在在每个文本条目上调用convert方法,导致在键入内容时格式化double。即使您不使用格式,也存在无法输入小数点的问题。
这可以通过不使用UpdateSourceTrigger = Propertychanged来解决,但我们需要这个来进行验证。我们使用IDataErrorInterface实现验证。我知道有一个ValidateWithoutUpdate method,但这对使用IDataErrorInterface进行验证不起作用。
所以我基本上需要的是ConvertBack(以及验证)发生OnPropertyChanged并且转换为仅发生OnLostFocus。
这可能吗?或者我们的问题还有其他解决方案吗?
答案 0 :(得分:0)
是的,行为从.Net 3.5更改为.Net 4.0,即使更新源自目标,它现在也会将源更新发送回目标。这篇SO帖子解释了一下并提供了解决方案:
Why does binding setup behave differently in .NET 4 vs .NET 3.5
到目前为止,我发现这些是处理此问题的选项: