C# 我把验证放在哪里

C# 我把验证放在哪里,c#,wpf,validation,mvvm,C#,Wpf,Validation,Mvvm,我正在“动态”学习MVVM,但在找到验证程序类的正确位置时遇到了困难 我有我的businesslogic项目和WPF项目。最后一个是按照MVVM模式创建的 该应用程序的目的是从外部设备读取数据并验证该数据。 验证方法(每个设备属性1个)存储在BL中 在GUI中,我需要显示设备属性以及它们是否有效 我现在所拥有的: 1视图(MainWindowView) 1视图模型(MainWindowViewModel) 1个型号(DeviceModel) MainWindowViewModel具有类型为D

我正在“动态”学习MVVM,但在找到验证程序类的正确位置时遇到了困难

我有我的businesslogic项目和WPF项目。最后一个是按照MVVM模式创建的

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

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

我现在所拥有的:

  • 1视图(
    MainWindowView
  • 1视图模型(
    MainWindowViewModel
  • 1个型号(
    DeviceModel
MainWindowViewModel
具有类型为
DeviceModel
的属性。此属性用于在视图上显示设备数据。 目前,我有一些类型为
bool
的HasValidPropXxxx属性,它们绑定到相应文本框的
Background
-属性(使用
IValueConverter
bool
Color
)。 因为只有5处房产,我觉得它们的位置不错

现在需求发生了变化(很明显),我必须显示和验证更多的设备属性。 我正在考虑创建一个
DeviceValidator
-类,它保存所有HasValidPropXxxx属性,并对BL进行验证调用

我想知道的是:

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

  • 您可以使用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;
    }