2017-03-02 78 views
0

我有一個MVVM體系結構的WPF應用程序。視圖模型實現了IDataErrorInfo,其實現將嵌套視圖模型添加錯誤。 SaveCommand將檢查最上面的視圖模型的錯誤,並顯示一個錯誤MesssageBox,如果有任何錯誤與所有錯誤的列表。模型和控件中的WPF MVVM驗證

對於由業務邏輯(如必填字段)檢查的錯誤可以正常工作,但不會在處理轉換錯誤時處理。用戶將一個名稱輸入綁定到數字屬性的TextBox。

是否有一個很好的方法/庫結合來自ViewModel錯誤和那些在UI中指出,但實際上並沒有達到視圖模型?回溯到viewmodel中的所有字符串屬性,因此可以完成轉換,感覺就是錯誤。我想通過邏輯控制樹來獲取由轉換錯誤導致的所有錯誤的列表,然後將此列表與INotifyDataInfo errorMessage結合起來,但也許有更好的方法?

+0

像這樣的很多問題可以通過使用適當的控件解決,如果用戶應該輸入1到100之間的值爲什麼使用文本框,當滑塊設計爲這樣的時候,視圖模型不應該驗證視圖,它只驗證由視圖傳遞給它的數據。所以任何你想做什麼的庫都會違反MVVM – MikeT

+0

*用戶在綁定到數字屬性*的文本框中輸入一個名稱,應該在UI中自動顯示錯誤 – Will

+0

它顯示控件中的錯誤,但視圖模型不知道任何內容關於它,因爲錯誤來自綁定的值轉換。因此,當調用Save時,依賴於它自己的IDataErrorInfo的視圖模型將有效地執行保存,同時某些控件顯示綁定錯誤。 –

回答

0

您可以使用自定義ValidationRule並將其與Binding對象關聯以定製行爲或此驗證。有關詳細信息,請參閱以下博文:https://blog.magnusmontin.net/2013/08/26/data-validation-in-wpf/

<TextBox> 
    <TextBox.Text> 
     <Binding Path="Age" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <local:StringToIntValidationRule ValidationStep="RawProposedValue"/> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
    ... 
</TextBox> 


public class StringToIntValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     int i; 
     if (int.TryParse(value.ToString(), out i)) 
      return new ValidationResult(true, null); 

     return new ValidationResult(false, "Please enter a valid integer value."); 
    } 
} 

另請注意,這種驗證發生在視圖或控件中。視圖模型的責任不在於確保視圖可以設置視圖模型公開屬性的值。

它只是公開屬性,它是視圖的責任來設置它,當然它必須將它設置爲正確類型的值。