0

在我们的项目中,我们有一个绑定到双精度的 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。
这可能吗?或者我们的问题有其他解决方案吗?

4

1 回答 1

0

是的,行为从 .Net 3.5 更改为 .Net 4.0,它现在将源更新发送回目标,即使更新源自目标。这个 SO post 解释了一下并提供了一个解决方案:

为什么绑定设置在 .NET 4 和 .NET 3.5 中的行为不同

这些是我迄今为止发现的用于处理此问题的选项:

  • 让转换器保持 ConvertBack 上的输入状态并在 Convert 中恢复它(建议在上面的链接中)
  • 将支持数据更改为字符串,处理模型中的转换
  • 创建一个处理这种数字输入的自定义控件,类似于 DateTimePicker 的工作方式(它维护数据的字符串和双精度表示;显示字符串,但受双精度约束)
于 2013-04-25T23:58:35.347 回答