Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用WPF MVVM从ViewModel访问Validation.HasError_C#_Wpf_Validation_Mvvm - Fatal编程技术网

C# 使用WPF MVVM从ViewModel访问Validation.HasError

C# 使用WPF MVVM从ViewModel访问Validation.HasError,c#,wpf,validation,mvvm,C#,Wpf,Validation,Mvvm,所以我承认我已经搜索了一点,但找不到我想要的答案。我觉得我可能在寻找错误的标签 我有一个视图,它有一个文本框,通过实现ValidationRule的Validation类应用一些验证。我正确地验证了它,并且我的文本框适当地高亮显示/工具提示 现在我已经进行了验证,我想也许我可以阻止在Validation.hasrerror=true时启用提交按钮。我的ViewModel不知道这个ValidationRule,也不知道ValidationRule返回了false,“一些错误消息”。现在正确的做法是

所以我承认我已经搜索了一点,但找不到我想要的答案。我觉得我可能在寻找错误的标签

我有一个视图,它有一个文本框,通过实现ValidationRule的Validation类应用一些验证。我正确地验证了它,并且我的文本框适当地高亮显示/工具提示

现在我已经进行了验证,我想也许我可以阻止在Validation.hasrerror=true时启用提交按钮。我的ViewModel不知道这个ValidationRule,也不知道ValidationRule返回了false,“一些错误消息”。现在正确的做法是什么?我更愿意将验证放在我的“模型”之外,并将其留在ValidationRule类中


我是否可以创建一个布尔属性“HasValidationError”,并在Validation.HasError设置为true时将其设置为true

我建议您将验证逻辑放在ViewModel中,并使用IDataErrorInfo处理UI的验证。在我们的应用程序中,验证是一项独立的服务


好处是您可以完全控制处理ViewModel级别错误和属性级别错误。即使您找到了将ViewModel的hasValidationError与所有控件的ValidationRule关联的方法,但仍然存在一个潜在的问题,即ViewModel的错误只取决于UI而不是其真实逻辑,这意味着,在UI验证ViewModel之前,您永远无法判断ViewModel是否正确。

我同意Bill Zhang的观点,当您使用MVVM模式时,验证逻辑应该驻留在视图模型中。原因有很多,但主要原因是视图的验证应该是可测试的,并且测试视图模型比测试视图容易得多

说教够了,让我们看一些代码。您可以看看我在视图模型中验证的文章。我可以像这样注册验证器:

class ExcludeItemDialogViewModel : DialogViewModelBase
{
  public ExcludeItemDialogViewModel(string title, string excludeItem)
  {
    AddValidator(() => ExcludedItem, new NotNullOrEmptyValidationRule());

    // Code removed for clarity...
  }

  // Code removed for clarity...
}
class NotNullOrEmptyValidationRule : IValidationRule
{
  public string ErrorMessage { get; private set; }

  public bool Validate(object value)
  {
    string valueText = value as string;

    if (string.IsNullOrEmpty(valueText))
    {
      ErrorMessage = Resources.NotNullValidationRule_Error;
      return false;
    }

    ErrorMessage = string.Empty;
    return true;
  } 
}
调用AddValidator方法将为视图模型中的特定属性注册验证器,在本例中为ExcludedItem。验证规则如下所示:

class ExcludeItemDialogViewModel : DialogViewModelBase
{
  public ExcludeItemDialogViewModel(string title, string excludeItem)
  {
    AddValidator(() => ExcludedItem, new NotNullOrEmptyValidationRule());

    // Code removed for clarity...
  }

  // Code removed for clarity...
}
class NotNullOrEmptyValidationRule : IValidationRule
{
  public string ErrorMessage { get; private set; }

  public bool Validate(object value)
  {
    string valueText = value as string;

    if (string.IsNullOrEmpty(valueText))
    {
      ErrorMessage = Resources.NotNullValidationRule_Error;
      return false;
    }

    ErrorMessage = string.Empty;
    return true;
  } 
}

所以我看了一下你这个项目的源代码。看起来所有验证都是由ViewModel单独处理的,这是否意味着视图从未意识到验证错误?最好利用视图中内置的ValidationError(比如文本框高亮显示为红色,框左上角有一个标记指示错误消息等)。这是不能做到的,还是我在代码中遗漏了什么?视图知道验证错误,因为视图模型实现了IDataErrorInfo接口。然后,它接受视图模型负责在发生验证错误时向视图报告。