C# 我把验证放在哪里
我正在“动态”学习MVVM,但在找到验证程序类的正确位置时遇到了困难 我有我的businesslogic项目和WPF项目。最后一个是按照MVVM模式创建的 该应用程序的目的是从外部设备读取数据并验证该数据。 验证方法(每个设备属性1个)存储在BL中 在GUI中,我需要显示设备属性以及它们是否有效 我现在所拥有的:C# 我把验证放在哪里,c#,wpf,validation,mvvm,C#,Wpf,Validation,Mvvm,我正在“动态”学习MVVM,但在找到验证程序类的正确位置时遇到了困难 我有我的businesslogic项目和WPF项目。最后一个是按照MVVM模式创建的 该应用程序的目的是从外部设备读取数据并验证该数据。 验证方法(每个设备属性1个)存储在BL中 在GUI中,我需要显示设备属性以及它们是否有效 我现在所拥有的: 1视图(MainWindowView) 1视图模型(MainWindowViewModel) 1个型号(DeviceModel) MainWindowViewModel具有类型为D
- 1视图(
)MainWindowView
- 1视图模型(
)MainWindowViewModel
- 1个型号(
)DeviceModel
MainWindowViewModel
具有类型为DeviceModel
的属性。此属性用于在视图上显示设备数据。
目前,我有一些类型为bool
的HasValidPropXxxx属性,它们绑定到相应文本框的Background
-属性(使用IValueConverter
从bool
到Color
)。
因为只有5处房产,我觉得它们的位置不错
现在需求发生了变化(很明显),我必须显示和验证更多的设备属性。
我正在考虑创建一个DeviceValidator
-类,它保存所有HasValidPropXxxx属性,并对BL进行验证调用
我想知道的是:
您可以使用system.componentmodel.dataannotations来验证属性。然后调用validate方法来执行这些数据注释。
虽然看你的名声,我想你知道这些。如果是这样,忽略这个答案进行验证,我总是实现or接口,第二个是更新的,并且(在我看来)更好。在模型或数据类型类中实现这些接口时,可以在定义属性的位置提供验证。这对我来说完全有意义,因为它还允许使用多个属性值执行复杂的验证 下面是
IDataErrorInfo
的一个简短示例。。。首先执行项
索引器方法:
public override string this[string propertyName]
{
get
{
string error = string.Empty;
if (propertyName == "Name" && Name == string.Empty) error = "Enter Name";
else if (propertyName == "Age" && Age < 18) error = "You're too young";
return error;
}
}
更新>>>
当我想根据error
属性中是否存在错误消息来更改某些内容时,我会将bool
属性添加到模型基类中:
public bool HasError
{
return Error != null && Error != string.Empty;
}
然后,我简单地将这个bool
属性与booltowateverconverter
一起使用。。。在您的例子中,您需要创建一个BooleanToBrushConverter
。如果你需要帮助,请问另一个问题,我会留意的
更新2>>>
@Koen,HasError
属性反映模型对象中是否存在任何验证错误,这是正确的。但是,没有什么可以阻止您将另一个属性添加到特定的数据类型类中:
string nameError = "Enter Name";
...
public override string this[string propertyName]
{
get
{
string error = string.Empty;
if (propertyName == "Name" && Name == string.Empty) error = nameError;
else if (propertyName == "Age" && Age < 18) error = "You're too young";
return error;
}
}
public bool HasNameError
{
return Error == nameError;
}
string Name错误=“输入名称”;
...
公共重写字符串此[string propertyName]
{
得到
{
字符串错误=string.Empty;
if(propertyName==“Name”&&Name==string.Empty)error=namererror;
否则如果(propertyName==“Age”&&Age<18)error=“你太年轻了”;
返回误差;
}
}
公共布尔HasNameError
{
返回错误==名称错误;
}
当然,最好在模型类中包含这些属性,这样就不必在模型类出现的每个视图模型中复制代码。我过去没有使用过它,但在我的情况下,我认为它不合适。我将不得不编写大量(小型)自定义验证器类(几乎每个设备属性1个)。我认为将所有这些验证方法放在一个类中更具可读性(IMHO)。当设备属性无效时,我需要更改相应文本框/标签的背景。使用这些接口是否可能做到这一点?乍一看,我不知道怎么做。我已经让BoolToBrushConverter工作了,但我想知道我是否可以使用IDataErrorInfo更改1文本框的颜色,而不管其他程序是否有错误。目前,我对每个属性都有一个
IsValidPropXxxx
。查看您的更新,这是对完整对象的验证。我是正确的吗?@Koen:请看链接,这将有关于ErrorTemplate@Sheridan Thx的解释。你说服了我@Ravuthasamy非常感谢这个有趣的链接,但是对于这个项目,我将不得不编写太多的验证类来实现不同的规则。在我的例子中,如果我可以将验证放在每个属性的方法中,那么就更容易(也更可读)。
string nameError = "Enter Name";
...
public override string this[string propertyName]
{
get
{
string error = string.Empty;
if (propertyName == "Name" && Name == string.Empty) error = nameError;
else if (propertyName == "Age" && Age < 18) error = "You're too young";
return error;
}
}
public bool HasNameError
{
return Error == nameError;
}