使用WPF MVVM从ViewModel访问Validation.HasError

时间:2013-06-27 21:26:59

标签: c# wpf validation mvvm

所以我承认我搜索了一下,找不到我要找的答案。我觉得我很可能会搜索错误的标签。

我有一个View,它有一个文本框,通过实现ValidationRule的验证类应用一些验证。我已正确验证它,我的文本框适当地突出显示/工具提示。

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

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

2 个答案:

答案 0 :(得分:1)

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

好处是您可以完全控制ViewModel级别错误和属性级别错误。即使您发现将ViewModel的hasValidationError关联到所有控件的ValidationRule,仍然存在一个潜在的问题,即您的ViewModel的错误仅依赖于UI而不是其真实逻辑,这意味着,在您的UI验证ViewModel之前,您永远无法判断ViewModel是否存在是对的。

答案 1 :(得分:1)

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

足够的讲道,让我们看一些代码。您可以查看我在视图模型中验证的文章Zip My Code on CodeProject。我可以注册这样的验证器:

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

    // Code removed for clarity...
  }

  // Code removed for clarity...
}

调用方法AddValidator将为视图模型中的特定属性注册验证器,在本例中为ExcludedItem。验证规则如下所示:

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