2013-10-08 66 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

相關問題