2013-06-27 71 views
0

所以我承認我搜索了一下,找不到我正在尋找的答案。我覺得我很可能在尋找錯誤的標籤。使用WPF MVVM從ViewModel訪問Validation.HasError

我有一個視圖有一個文本框,通過實現ValidationRule的驗證類應用一些驗證。我有它適當的驗證和我的文本框突出/工具提示適當。

現在我已經驗證了,我想也許我可以在Validation.HasError = true時阻止Submit按鈕被啓用。我的ViewModel不知道這個ValidationRule,也沒有ValidationRule返回false,「一些錯誤信息」。現在做這件事的正確方法是什麼?我寧願將驗證放在我的「模型」一邊,並將其保留在ValidationRule類中。

當Validation.HasError設置爲true時,我可以創建一個布爾屬性「HasValidationError」並將其設置爲true嗎?

回答

1

我建議你在ViewModel中放置驗證邏輯並使用IDataErrorInfo來處理用戶界面的驗證。在我們的應用程序中,驗證是一項獨立的服務。

好處是您可以完全控制ViewModel級別的錯誤和屬性級別的錯誤。即使你找到一種方法將ViewModel的hasValidationError與所有控件的ValidationRule相關聯,仍然存在一個潛在的問題,即ViewModel的錯誤只依賴於UI而不是它的真實邏輯,這意味着在你的UI驗證ViewModel之前,你永遠無法分辨ViewModel是正確的。

1

我同意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; 
    } 
} 
+0

因此,我查看了該項目的源代碼。它看起來像所有的驗證完全由ViewModel處理,這是否意味着View從來不知道驗證錯誤?利用視圖中內置的ValidationError事物(如文本框突出顯示爲紅色,在框左上方標記指示錯誤消息等)將會很好。這不能做或我錯過了代碼中的東西? – Tada

+0

視圖知道驗證錯誤,因爲視圖模型實現了IDataErrorInfo接口。然後它接受視圖模型負責在出現驗證錯誤時向視圖報告。 – FantasticFiasco

相關問題