所以我承认我搜索了一下,找不到我要找的答案。我觉得我很可能会搜索错误的标签。
我有一个View,它有一个文本框,通过实现ValidationRule的验证类应用一些验证。我已正确验证它,我的文本框适当地突出显示/工具提示。
现在我已经验证了,我想也许我可以在Validation.HasError = true时阻止启用“提交”按钮。我的ViewModel不知道这个ValidationRule,也没有ValidationRule返回false,“一些错误消息”。现在这样做的正确方法是什么?我更喜欢将验证保留在我的“模型”之外,并将其保留在ValidationRule类中。
当Validation.HasError设置为true时,我可以创建一个布尔属性“HasValidationError”并将其设置为true吗?
答案 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;
}
}