WPF处理转换器错误和视图模型验证

时间:2017-03-24 19:55:28

标签: c# wpf validation mvvm converter

我有一个带有INotifyDataErrorInfo的MVVM应用程序,所有这些都已设置并正常运行。目前,我能够验证我的所有属性并阻止用户进行处理,直到处理完所有错误。一切都是阳光和玫瑰,直到最近我们意识到我们的一些控件(文本框和标签组合显示数字和单位类型,即100毫米)在删除值/退格时没有显示红色错误装饰器。

控件上有一个转换器,它接受一个double并将其格式化为一个字符串,以便在文本框中显示。我们在convertback方法中发现了一个问题,如果转换无法将字符串转换回double,它就会发送Binding.DoNothing。我们将其更改为DependencyProperty.UnsetValue,并认为一切都可以正常工作,但这发现了一个更大的问题。

我们现在遇到的问题是视频模型没有被通知转换器发生故障,我不知道该怎么做。当用户删除文本框内容时,将使用空字符串调用转换器。那个空字符串不会解析为double。

我觉得我需要一种方法来通知VM转换失败,因此它可以将属性标记为hasError。我认为没有办法做到这一点。这是转换方法的代码。

        public object[] ConvertBack(object value, Type[] targetTypes, object           parameter, CultureInfo culture)
    {
        var strVal = value as string;
        double dblVal = 0;
        bool isSuccess = double.TryParse(strVal, out dblVal);

        if (_systemUnits == SystemUnits.Metric && isSuccess)
        {
            return new[] { dblVal, Binding.DoNothing };
        }
        else if (_systemUnits != SystemUnits.Metric && isSuccess)
        {
            return new[] { Binding.DoNothing, dblVal };
        }
        else
        {
            return new[] { Binding.DoNothing, Binding.DoNothing };
        }
    }
}

我不确定其他代码是否相关,但如果您认为它会有所帮助,我愿意发布更多代码。谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

  

我觉得我需要一种通知虚拟机的方法

提供app类的静态关闭,该类具有相关VM的最新实例,并且在转换器访问中静态并直接从其调用方法/属性以通知状态。

<强> -Or -

我建议您创建计算属性,这些属性与转换器执行相同的工作,以提供您提及的失败的估计值。

然后,您只需访问计算属性并执行您需要完成的过程。

这是一个示例属性IsOverLimit,如果需要可以绑定,并通过其INotifyPropertyChange等检查状态...

public bool IsOverLimit { get { return ThreadCreationLimit > 120 } }

 public uint ThreadCreationLimit
    {
        get { return _ThreadCreationLimit; }
        set
        {
            _ThreadCreationLimit = value;
            OnPropertyChanged("ThreadCreationLimit");
            OnPropertyChanged("IsOverLimit");
        }
    }