Wpf文本框转换器与updatesourcetrigger = propertychanged组合使用

时间:2013-02-11 09:11:48

标签: wpf validation binding textbox updatesourcetrigger

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

1 个答案:

答案 0 :(得分:0)

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

Why does binding setup behave differently in .NET 4 vs .NET 3.5

到目前为止,我发现这些是处理此问题的选项:

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