2010-09-08 65 views
4

我們正在設計一個允許用戶搜索和操作聯繫人記錄的WPF/MVVM應用程序。我應該如何訪問ViewModel的底層實體/模型

我們有一個MainViewModel,它包含一個ContactViewModel對象的可觀察集合,每個對象都包裝從我們的業務層返回的Contact實體。用戶界面將這些顯示在列表中,SelectedItem屬性綁定到MainViewModel上相應的SelectedContact屬性。

我們還會有一個按鈕或其他命令綁定到由MainViewModel公開的'ProcessContact'ICommand的按鈕。

ProcessContact需要採用選定的聯繫人並對其進行處理,這並不重要。

我的問題是:獲取所選ContactViewModel封裝的底層Contact對象的正確方法是什麼?我可以在我的視圖模型上公開Contact屬性,但這意味着視圖可能會直接綁定到屬性上。

我發現自己將ViewModel實例傳遞給了很多人,當我真正想要的是它正在包裝的實體時,感覺不對。

我錯過了一些明顯的東西嗎?

編輯:一對夫婦的同事攔腰抱住建議:

  • 揭露實體的視圖模型一個受保護的財產,這將阻止視圖綁定到它(假定視圖類是在一個單獨的組裝)

  • 停止試圖完全訪問模型。如果我們想以某種方式處理底層實體,我們在ViewModel上調用一個方法。在我的例子中,我們可能有一個關閉ContactViewModel的.Process方法。 (「SelectedContact.Process()」)

第二個選項感覺就像一個更好的解決方案給我,但不知道是否我們應該把那麼多的邏輯到視圖模型(但如果不存在,又在哪裏? )

回答

1

你的第二個建議似乎對我更正確。我通常將我的數據封裝在一個視圖模型中,該模型就像控制器一樣......它應該控制用戶在視圖中的操作對數據的影響。所以我會去包裝你的數據,然後將適當的行爲附加到你的視圖模型。我不知道爲什麼你會擔心爲視圖模型添加太多的邏輯,這是它的工作!

0

我建議在您的MainViewModel中有一個可觀察的Contact對象集合。框架將自動支持實體屬性的更改通知,並且您甚至不需要在實體中實現INotifyPropertyChanged。

如果您有任何特定的原因將您的聯繫實體包裝在viewmodel中(我很想知道它們),您將不得不公開聯繫對象(通過屬性 )並使用它。

+0

如果我想綁定到,例如,聯繫人的姓,該怎麼辦。我的聯繫人實體不支持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

0

不要將模型包裹在ViewModel中。至少不要將其公開爲公共財產。

您可以讓您的演示者成爲Model的觀察者,以便在Model更改時得到通知。您的演示者然後可以調用視圖並將其傳遞給ViewModel

+1

我不認爲在MVVM中將模型包裝在ViewModel中並不常見。請參閱msdn上的Josh Smiths文章:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx其中每個CustomerViewModel類都具有對基礎Customer對象的引用)。在這種情況下,模型類只是數據的容器,並且不會暴露任何會使它們可觀察的東西(屬性更改通知等),這就是虛擬機在那裏的原因...... – 2010-09-10 11:26:49

相關問題