我們正在設計一個允許用戶搜索和操作聯繫人記錄的WPF/MVVM應用程序。我應該如何訪問ViewModel的底層實體/模型
我們有一個MainViewModel,它包含一個ContactViewModel對象的可觀察集合,每個對象都包裝從我們的業務層返回的Contact實體。用戶界面將這些顯示在列表中,SelectedItem屬性綁定到MainViewModel上相應的SelectedContact屬性。
我們還會有一個按鈕或其他命令綁定到由MainViewModel公開的'ProcessContact'ICommand的按鈕。
ProcessContact需要採用選定的聯繫人並對其進行處理,這並不重要。
我的問題是:獲取所選ContactViewModel封裝的底層Contact對象的正確方法是什麼?我可以在我的視圖模型上公開Contact屬性,但這意味着視圖可能會直接綁定到屬性上。
我發現自己將ViewModel實例傳遞給了很多人,當我真正想要的是它正在包裝的實體時,感覺不對。
我錯過了一些明顯的東西嗎?
編輯:一對夫婦的同事攔腰抱住建議:
揭露實體的視圖模型一個受保護的財產,這將阻止視圖綁定到它(假定視圖類是在一個單獨的組裝)
停止試圖完全訪問模型。如果我們想以某種方式處理底層實體,我們在ViewModel上調用一個方法。在我的例子中,我們可能有一個關閉ContactViewModel的.Process方法。 (「SelectedContact.Process()」)
第二個選項感覺就像一個更好的解決方案給我,但不知道是否我們應該把那麼多的邏輯到視圖模型(但如果不存在,又在哪裏? )
如果我想綁定到,例如,聯繫人的姓,該怎麼辦。我的聯繫人實體不支持INotifyPropertyChanged(也不應該是POCO業務對象),但ContactViewModel *不支持*,並且可以將聯繫人的屬性更新集中到一起,同時引發NotifyPropertyChanged。請參閱msdn上的Josh Smiths MVVM文章:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx - 將他的Customer/CustomerViewModel替換爲我的Contact/CntactViewModel,您將擁有幾乎相同的情況。 – 2010-09-09 07:47:24