0

我正在“即时”学习 MVVM,但在找到验证器类的正确位置时遇到了麻烦。

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

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

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

我现在拥有的:

  • 1 次观看 ( MainWindowView)
  • 1 个视图模型 ( MainWindowViewModel)
  • 1 个模型 ( DeviceModel)

MainWindowViewModel具有类型的属性DeviceModel。此属性用于在视图上显示设备数据。目前,我有一些HasValidPropXxxx类型的属性,bool它们绑定到Background相应文本框的 -property (使用IValueConverterfrom boolto Color)。由于它只有 5 处房产,我认为它们的位置很好。

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

我想知道的是:

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

2 回答 2

1

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

这是一个简短的示例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该索引器设置的属性。我们可以Bind在 UI 中通过该属性来显示错误消息,但在此界面中一次只显示一条,无需自定义:

<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;
}

最好在模型类中包含这些属性,这样您就不必在模型类出现的每个视图模型中复制代码。

于 2013-10-08T10:19:40.877 回答
0

您可以使用 system.componentmodel.dataannotations 来验证属性。然后调用 validate 方法来执行这些数据注释。虽然看着你的声誉,我假设你知道这些。如果是这样,请忽略此答案

于 2013-10-08T10:07:58.280 回答