c# - INotifyDataErrorInfo 和绑定(bind)异常

标签 c# wpf validation mvvm

我正在使用 INotifyDataErrorInfo 接口(interface)来实现通用 MVVM 验证机制。我通过调用 OnValidate 而不是 OnPropertyChanged 来实现该接口(interface):

public void OnValidate(dynamic value, [CallerMemberName] string propertyName = null)
{
        if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        Validate(propertyName, value);
}

在验证方法中,我生成验证错误,将它们添加到字典中,并在发现或清除验证错误时引发 ErrorsChanged 事件:

if (entry.Validate(strValue, out errorNumber, out errorString) == false)
{
      _validationErrors[propertyName] = new List<string> {errorString};
      RaiseErrorsChanged(propertyName);
}
else if (_validationErrors.ContainsKey(propertyName))
{
      _validationErrors.Remove(propertyName);
      RaiseErrorsChanged(propertyName);
}

HasErrors 属性是通过查看错误字典来实现的:

    public bool HasErrors
    {
         get { return _validationErrors.Any(kv => kv.Value != null 
                   && kv.Value.Count > 0); }
    }

为了防止在出现验证错误时启用保存按钮 - 保存命令 canExecuteMethod 查看 HasErrors 属性:

private bool IsSaveEnabled()
{
    return HasErrors == false;
}

一切正常,除了我遇到绑定(bind)错误的情况 - 如果绑定(bind)值是(例如)整数,则输入非整数 - 文本框的 ErrorContent 会使用错误字符串进行更新:“Value '某些内容'无法转换”。 但 INotifyDataErrorInfo 机制并未对此进行更新。尽管 View 中存在错误,但 HasErrors 仍然为 false,并且“保存”已启用。 我想找到一种方法将绑定(bind)异常传播到 INotifyDataErrorInfo 机制,这样我就能够:

  1. 禁用“保存”按钮(必须)。
  2. 将验证错误消息更改为更有意义的错误字符串(很高兴拥有)。

我想找到一个通用的 MVVM 解决方案,而无需在 View 后面添加代码。

感谢您的帮助

最佳答案

string int 情况不适用于 MVVM,因为您的 View 模型由于绑定(bind)异常而无法获取任何信息。

我看到有两种方法可以获得您想要的验证:

  1. 只需在 View 模型中使用字符串属性,当您必须转到模型时,只需将字符串转换为您的模型类型即可。
  2. 创建行为或“特殊”控件,以便 View 中的输入始终“可转换”为 View 模型类型。

顺便说一句,我使用第二种方法,因为我必须这样做:),但第一种方法总是有效,而且对我来说似乎更容易。

关于c# - INotifyDataErrorInfo 和绑定(bind)异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30025757/

相关文章:

java - ConstraintViolationException 不能同时适用于 DTO 和 MODEL 类

c# - 是否有与 Python 的 chr 和 ord 等效的 C#?

wpf - 在 Wpf 应用程序中使用 Prism 进行导航

c# - WPF:修剪所有文本框

c++ - 输入字符串时使用 cin 无限循环,而需要输入数字

unit-testing - Grails 域验证器 : Two fields, 可以为 null,但不能同时为 null

C# 检索佳能特定的 EXIF 数据

c# - 垃圾收集和 GCHandle.Alloc

c# - C++ 从另一个程序集继承 WPF 窗口并处理事件

wpf - Control.MouseButtons 的 WPF 版本是什么?