C# 使用WPF MVVM从ViewModel访问Validation.HasError
所以我承认我已经搜索了一点,但找不到我想要的答案。我觉得我可能在寻找错误的标签 我有一个视图,它有一个文本框,通过实现ValidationRule的Validation类应用一些验证。我正确地验证了它,并且我的文本框适当地高亮显示/工具提示 现在我已经进行了验证,我想也许我可以阻止在Validation.hasrerror=true时启用提交按钮。我的ViewModel不知道这个ValidationRule,也不知道ValidationRule返回了false,“一些错误消息”。现在正确的做法是什么?我更愿意将验证放在我的“模型”之外,并将其留在ValidationRule类中C# 使用WPF MVVM从ViewModel访问Validation.HasError,c#,wpf,validation,mvvm,C#,Wpf,Validation,Mvvm,所以我承认我已经搜索了一点,但找不到我想要的答案。我觉得我可能在寻找错误的标签 我有一个视图,它有一个文本框,通过实现ValidationRule的Validation类应用一些验证。我正确地验证了它,并且我的文本框适当地高亮显示/工具提示 现在我已经进行了验证,我想也许我可以阻止在Validation.hasrerror=true时启用提交按钮。我的ViewModel不知道这个ValidationRule,也不知道ValidationRule返回了false,“一些错误消息”。现在正确的做法是
我是否可以创建一个布尔属性“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接口。然后,它接受视图模型负责在发生验证错误时向视图报告。