我在哪里放置验证

本文关键字:验证 在哪里 | 更新日期: 2023-09-27 18:34:34

我正在"动态"学习 MVVM,但我无法找到验证器类的正确位置。

我的业务逻辑项目和 WPF 项目。最后一个是按照 MVVM 模式创建的。

该应用程序的目的是从外部设备读取数据并验证该数据。验证方法(每个设备属性 1 个(存储在 BL 中。

在GUI中,我需要显示设备属性以及它们是否无效。

我现在拥有的:

  • 1 查看 ( MainWindowView (
  • 1 视图模型 ( MainWindowViewModel (
  • 1 型号 ( DeviceModel (

MainWindowViewModel具有类型 DeviceModel 的属性。此属性用于在视图上显示设备数据。目前,我有一些类型为boolHasValidPropXxxxx属性,这些属性绑定到相应文本框的Background-属性(使用从boolColorIValueConverter(。由于只有5个物业,我认为他们是一个不错的地方。

现在要求已经改变(显然(,我必须显示和验证更多的设备属性。我正在考虑创建一个DeviceValidator类,该类包含所有HasValidPropXxxx属性并对BL进行验证调用。

我想知道的是:

  1. 这是一种好的思维方式(尤其是关于 MVVM(
  2. 我应该把验证器放在什么位置:模型?视图模型?其他文件夹?

我在哪里放置验证

为了验证,我总是实现IDataErrorInfoINotifyDataErrorInfo接口,第二个是更新的,(在我看来(更好。在模型或数据类型类中实现这些接口时,可以在定义属性的位置提供验证。这对我来说完全有意义,因为它还允许使用多个属性值执行复杂的验证。

这是一个简短的例子 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来验证属性。然后调用验证方法来执行这些数据批注。虽然看你的名声,我想你知道这些。如果是这样,请忽略此答案