c# - WPF 处理转换器错误和 View 模型验证

标签 c# wpf validation mvvm converters

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

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

我们现在遇到的问题是,viewmodel 没有收到转换器失败的通知,我不知道该怎么做。当用户删除文本框内容时,将使用空字符串调用转换器。该空字符串不会解析为 double 字符串。

我觉得我需要一种方法来通知 VM 转换失败,以便它可以将属性标记为 hasError。我看不出有什么办法可以做到这一点。这是 convertback 方法的代码。

        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 };
        }
    }
}

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

最佳答案

I feel like I need a way to inform the VM

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

-或者-

我建议您创建计算 属性,它与转换器的工作相同,以提供您提到的故障的估计值。

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


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

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

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

关于c# - WPF 处理转换器错误和 View 模型验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43008092/

相关文章:

ruby-on-rails - Rails/PostgreSQL - 如何验证只能有两个用户 ID 的一种组合?

Java 日期验证问题

c# - Silverlight 5 和 VertexBuffer.GetData()

c# - WinForms 相当于 WPF 的 IsHitTestVisible

java.lang.NoSuchMethodException : userAuth. User.<init>()

wpf - 为什么 WPF/RotateTransform 使用如此多的 CPU?

c# - Caliburn Micro 发布/订阅

c# - 使用 Process.Start 运行时如何关闭 Internet Explorer?

c# - 将字符串转换为十进制

c# - 异步调用 wcf 4.5 WCF 服务