2013-10-08 63 views
0

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

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

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

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

我现在拥有的一切:

  • 1视图(MainWindowView
  • 1视图模型(MainWindowViewModel
  • 1个模型(DeviceModel

MainWindowViewModelDeviceModel类型的属性。该属性用于显示视图上的设备数据。 目前我有bool类型的几个HasValidPropXxxx属性被绑定到适当的文本框的Background -property(使用IValueConverterboolColor)。 由于它只有5个属性,我认为他们是在一个好地方。

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

我想知道的是:

  1. 这是一种思维(特别是关于MVVM)
  2. 在什么地方我应该把该验证的好方法:模型?的ViewModels?其他文件夹?

回答

1

为了验证,我总是实现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属性此索引集时,模型类的任何有关财产被改变。我们可以Bind此属性中显示错误消息的UI,但只有一个在使用此接口时无需定制:

<TextBlock Text="{Binding Error}" /> 
<TextBlock Text="{Binding Name}" /> 
<TextBlock Text="{Binding Age}" /> 

UPDATE >>>

当我想基于改变的东西是否存在在Error属性的错误消息,我添加bool属性到模型中的基类:

public bool HasError 
{ 
    return Error != null && Error != string.Empty; 
} 

然后,我只是使用此bool属性与BoolToWhateverConverter ...在你的情况下,你想创建一个​​。如果您需要帮助,请提出另一个问题,我会留意。

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

这当然是最好有在模型类,这些属性,所以您不必在每个视图复制代码模型类出现英寸

+0

当设备属性无效时,需要更改相应文本框/标签的背景。这可能使用这些接口吗?乍一看,我不知道如何。 – Koen

+0

我已经有BoolToBrushConverter的工作,但我想知道如果我可以 - 使用IDataErrorInfo - 更改1文本框的颜色,无论其他证书有错误。此时,我为每个属性都有一个“IsValidPropXxxx”。看看你的更新,它是验证完整的对象。我是否合照? – Koen

+0

@Koen:请看链接,这里将会有关于ErrorTemplate的解释http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errortemplate.aspx – Ravuthasamy

0

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

+0

我以前没有使用它,但在我的情况下,我不认为这是适当的。我将不得不写很多(小)自定义验证器类(对于设备的每个属性几乎都是1)。我认为它更具可读性(恕我直言)将所有这些验证方法放到1个类中。 – Koen

相关问题