2010-06-24 55 views
1

(我知道有一些親密的重複在那裏,但沒有人能夠幫助我,請聽我說)WPF驗證,不會觸發初始狀態

我的setter方法我模型在嘗試設置無效值時引發適當的異常。這在用戶輸入新值時驗證了驗證。

但是,當我創建一個新的模型對象時,初始狀態可能是無效的(描述中沒有值等)。這當然不會驗證,但沒有嘗試設置值的東西,沒有例外拋出爲ExceptionValidationRule捕捉。

的簡單的解決方案我已經有:

  1. 捕捉在當前對象的改變,觸發Current.Value = Current.Value型評估,以使.set_Value部分運行,並重新進行驗證(從而觸發ExceptionValidationRule更新狀態。然而,這種感覺骯髒和錯誤

  2. 漁獲物的變化,並調用手動財產的屬性驗證和 莫名其妙更新HasErrorValidation.Errors這將觸發對象更新它的視覺狀態。 這感覺更像是一個黑客比什麼,我不知道如何去了解它

現在最大的問題是,我大概可以導線的東西了那會工作的任一情況。但是他們完全違反了我的MVVM結構,我不知道如何在MVVM中進行這種驗證。

  • 我看過創建我自己的綁定類型,沒有骰子。
  • 我看了創造一個裝飾捕捉到我的孩子,可能的工作:需要更多信息
  • 我已經看了IDataError實現,這不會對我來說,因爲它需要使用this[string]索引的工作,這與我現有的模型對象的實現衝突。

所以我的想法,而我轉向所以,如何解決這個問題的一些見解。

回答

2

如果您的模型可能處於無效狀態,那麼實施IDataErrorInfo似乎是最合適的解決方案。使用IDataErrorInfo的問題是,您的模型中已有索引器,它接受字符串參數?你可以使用explicit interface implementation從自己的公開索引單獨實現IDataErrorInfo

public class Model 
    : IDataErrorInfo 
{ 
    public string this[string parameter] 
    { 
     get { /* Your current indexer */ } 
    } 

    string IDataErrorInfo.this[string columnName] 
    { 
     get { /* IDataErrorInfo indexer implementation */ } 
    } 

    /* ... */ 
} 

如果你不能修改你的模型的話,那麼你可能要作出這樣的包裝模型,並實現IDataErrorInfo一個ViewModel類。

1

我同意Quartermeister的說法,IDataErrorInfo接口可能是最好的選擇。當你不能實現這個[string]索引器時,你仍然可以用顯式成員實現接口。

string IDataErrorInfo.this[string memberName] 
{ 
    get { return ... } 
} 

你可能有一個看的WPF Application Framework (WAF)BookLibrary示例應用程序展示瞭如何在IDataErrorInfo的接口可與MVVM使用。