2009-10-14 107 views
6

嗯,我想我對MVVM有相當好的理解。但我需要一些澄清。MVVM,WPF和驗證

ViewModel是否負責調用相應的服務來保存模型信息?

如果是這樣,那麼ViewModel必須有一個乾淨的方式來確定它所保存的數據是否有效。如果數據有效,它將相應地更新模型。最後,在給定新更新的模型的情況下調用一個保存模型的服務。那麼問題是:我們如何驗證ViewModel的信息並在View中輕鬆顯示?

我見過幾種不同的驗證方法。一個建議使用IDataErrorInfo,我認爲這是絕對噁心的。

另一個是將ValidationRule添加到Binding.ValidationRules。但是,使用這種方法不能在整個模型的範圍內運作。 ValidationRule對象只能對單個值執行驗證。一個例子可能是確保一個值是一個整數或在一定範圍內。

我剛開始研究的另一個想法是使用BindingGroup的。但在這一點上,我對此一無所知,因爲我仍在閱讀。

我希望能夠在View和ViewModel使用的單個位置執行驗證邏輯。除了這個要求之外,我希望能夠對ViewModel中的任何其他值進行驗證。此外,如果ViewModel處於無效狀態,則可以阻止ViewModel保留數據。這需要很容易反映在視圖中。

如果有人能指點我的一些文章或提供一些洞察力,我希望我的方法,我會非常感激。

+1

出於興趣,您爲什麼認爲IDataErrorInfo令人厭惡? – 2009-10-15 06:32:38

+2

我認爲這是索引器的濫用開始。 ViewModel [「Name」]應該返回一個名稱... not null /「error!」。您也受限於您在視圖中綁定的屬性。它不會很好地適用於ValidateNameInformation等驗證器,它可以檢查涉及的所有字段。如果我在這些陳述中被誤解,請糾正我。 – Joe 2009-10-15 14:16:12

+2

我周圍濫用索引器的一種方式是使用顯式接口實現。這樣我就沒有一個奇怪的「索引器」亂丟我的ViewModel公共接口。我仍在研究如何使用MVVM驗證多個字段。 – 2009-12-21 14:39:10

回答

2

我們在我們的業務模型中進行數據驗證,並且只允許在業務模型允許時進行保存(因爲它具有有效數據),事後我們可以在視圖模型中做到這一點,但這意味着不同的驗證方法爲每個視圖模型。如果以不同的方式顯示相同的數據兩次,則可能必須重新編寫驗證邏輯。

我們在業務層的幾乎每個領域都做isdirty和isValid,我們編寫自己的自定義字段對象和一個自定義外部引用對象來實現這個。那麼我們可以將staraight綁定到這些屬性,以便在視覺上看到我們是否有效/髒等。然後我們通過視圖模型傳播這些屬性。

+2

你有幾個圖書館可以幫助你,例如驗證應用程序塊(http://msdn.microsoft.com/en-us/library/cc309509.aspx)和CSLA(http://www.lhotka.net/cslanet/) – armannvg 2009-10-15 14:55:44