2012-04-18 165 views
1

我的問題要求我根據一些依賴驗證跨視圖模型各個領域。我正在使用Silverlight,Prism和MVVM。驗證通過視圖模型圖/樹

爲例(從我的現實世界中的場景改變):

Simple class example

每艘可擁有許多容器,容器可以有很多的項目。

每個類都從NotificationObject繼承,每當屬性發生更改時都會調用RaisePropertyChanged

我的業務規則,以確保Item.ColourItem.NameItem.Size不是空當地產Ship.TypeId等於1。如果Ship.TypeId等於別的,我不需要在項目來驗證性能。

目前驗證在OnPropertyChanged事件視圖模型正在開展。

我所面臨的問題是,如果我在項目類添加驗證,那麼該對象有沒有的知識Ship.TypeId。如果我申請了項目甩出集裝箱PropertyChanged事件,我可以檢測從船舶內財產的變化,但只能獲得屬性名(相對於子類,即名稱),但沒有新的或舊值。

我希望能夠做的是驗證子項,同時明知Ship.TypeId的,也知道哪一個名稱顏色尺寸屬性發生變化,並能在用戶界面上針對正確的字段提出錯誤。

非常感謝, 阿德里安

+0

你在使用IDataErrorInfo嗎? – 2012-04-18 08:17:08

+0

我正在使用'INotifyDataErrorInfo',它看起來好像我正在使用的'NotificationObject'類有一個自定義的'AddError'方法,它將錯誤添加到字典中。 – 2012-04-18 08:19:39

+0

爲什麼你需要舊的價值觀? – GazTheDestroyer 2012-04-18 10:43:38

回答

2

正如你所指出的,由於Item不知道一個Ship任何東西,它不應該做的是涉及船舶驗證。這可能是可以將屬性添加到Item,它使人們有可能在本地驗證(例如CanBeEmpty),但不知道更多的我不能說是否會是有意義的。

不指定編輯採用什麼格式,所以很難評論。如果船舶和物品都可以在同一個屏幕上進行實時編輯,那麼通過編輯物品或編輯船隻可以使驗證失敗。在這種情況下,我通常推遲驗證,直到通過單擊「確定」或其他操作提交所有編輯。當你被迫隨時保持有效時,編輯多件事情會讓你非常沮喪。

如果您只能編輯從船上孤立的項目,並在項目的額外的屬性本身沒有什麼意義的話,我會建議在ItemEditViewModel,它知道包裹船舶您的項目。這似乎是合理的,因爲創建有效的項目編輯需要船隻的知識,所以ViewModels在這樣的編輯屏幕上也需要船隻的知識。

+0

謝謝。它們都在同一個屏幕上可編輯。這是我繼承的系統,目前的風格是在ViewModel中驗證。正如我們在這裏介紹的那樣,當'Items'對'Ships'一無所知時,就會引發其他問題。我想我會去提交*驗證提交*選項。 – 2012-04-18 11:57:17