我同意Bill Zhang,當您使用MVVM模式時,驗證邏輯應該駐留在視圖模型中。原因很多,但主要的原因是視圖的驗證應該是可測試的,測試視圖模型比視圖更容易。
足夠的講道,讓我們看看一些代碼。你可以看看我的文章Zip My Code on CodeProject,我在視圖模型中驗證。我可以這樣註冊一個驗證:
class ExcludeItemDialogViewModel : DialogViewModelBase
{
public ExcludeItemDialogViewModel(string title, string excludeItem)
{
AddValidator(() => ExcludedItem, new NotNullOrEmptyValidationRule());
// Code removed for clarity...
}
// Code removed for clarity...
}
調用方法AddValidator會註冊一個驗證在視圖模型的特定屬性,在這種情況下ExcludedItem。驗證規則將如下所示:
class NotNullOrEmptyValidationRule : IValidationRule
{
public string ErrorMessage { get; private set; }
public bool Validate(object value)
{
string valueText = value as string;
if (string.IsNullOrEmpty(valueText))
{
ErrorMessage = Resources.NotNullValidationRule_Error;
return false;
}
ErrorMessage = string.Empty;
return true;
}
}
因此,我查看了該項目的源代碼。它看起來像所有的驗證完全由ViewModel處理,這是否意味着View從來不知道驗證錯誤?利用視圖中內置的ValidationError事物(如文本框突出顯示爲紅色,在框左上方標記指示錯誤消息等)將會很好。這不能做或我錯過了代碼中的東西? – Tada
視圖知道驗證錯誤,因爲視圖模型實現了IDataErrorInfo接口。然後它接受視圖模型負責在出現驗證錯誤時向視圖報告。 – FantasticFiasco