0

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

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

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

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

4

2 回答 2

1

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

讲完了,让我们看一些代码。您可以查看我在 CodeProject上的 Zip My Code 文章,我在该文章中在视图模型中进行了验证。我可以像这样注册一个验证器:

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;
  } 
}
于 2013-06-29T06:35:21.200 回答
1

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

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

于 2013-06-28T01:55:12.190 回答