我在哪里放置验证
本文关键字:验证 在哪里 | 更新日期: 2023-09-27 18:34:34
我正在"动态"学习 MVVM,但我无法找到验证器类的正确位置。
我的业务逻辑项目和 WPF 项目。最后一个是按照 MVVM 模式创建的。
该应用程序的目的是从外部设备读取数据并验证该数据。验证方法(每个设备属性 1 个(存储在 BL 中。
在GUI中,我需要显示设备属性以及它们是否无效。
我现在拥有的:
- 1 查看 (
MainWindowView
( - 1 视图模型 (
MainWindowViewModel
( - 1 型号 (
DeviceModel
(
MainWindowViewModel
具有类型 DeviceModel
的属性。此属性用于在视图上显示设备数据。目前,我有一些类型为bool
的HasValidPropXxxxx属性,这些属性绑定到相应文本框的Background
-属性(使用从bool
到Color
的IValueConverter
(。由于只有5个物业,我认为他们是一个不错的地方。
现在要求已经改变(显然(,我必须显示和验证更多的设备属性。我正在考虑创建一个DeviceValidator
类,该类包含所有HasValidPropXxxx属性并对BL进行验证调用。
我想知道的是:
- 这是一种好的思维方式(尤其是关于 MVVM(
- 我应该把验证器放在什么位置:模型?视图模型?其他文件夹?
为了验证,我总是实现IDataErrorInfo
或INotifyDataErrorInfo
接口,第二个是更新的,(在我看来(更好。在模型或数据类型类中实现这些接口时,可以在定义属性的位置提供验证。这对我来说完全有意义,因为它还允许使用多个属性值执行复杂的验证。
这是一个简短的例子 IDataErrorInfo
...首先实现Item
索引器方法:
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;
}
}
IDataErrorInfo
接口公开一个名为 Error
的属性,当模型类的任何相关属性发生更改时,此索引器将设置该属性。我们可以在 UI 中Bind
此属性以显示错误消息,但使用此界面一次只能显示一个,无需自定义:
<TextBlock Text="{Binding Error}" />
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Age}" />
更新>>>
当我想根据 Error
属性中是否存在错误消息来更改某些内容时,我将 bool
属性添加到模型基类中:
public bool HasError
{
return Error != null && Error != string.Empty;
}
然后我只是将这个bool
属性与BoolToWhateverConverter
一起使用......在您的情况下,您需要创建一个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;
}
当然,最好在模型类中具有这些属性,这样就不必在模型类所在的每个视图模型中复制代码。
system.componentmodel.dataannotations来验证属性。然后调用验证方法来执行这些数据批注。虽然看你的名声,我想你知道这些。如果是这样,请忽略此答案