2010-04-23 66 views
15

我正在使用mvvm指示燈來構建Silverlight應用程序。 是否有代碼片段顯示如何從另一個視圖模型或用戶控件的代碼中訪問視圖模型的屬性或命令?MVVM指示燈 - 如何訪問其他視圖中的屬性

我想這很簡單,但我不知何故錯過了一些東西。

Ueli

+0

這取決於您的控件的實施。您是在父視圖下的視圖之間共享ViewModel還是僅僅試圖在兩個獨立視圖之間共享屬性/命令? – 2010-04-23 15:29:55

+0

有問題的視圖可以嵌套在不同的視圖中,但它繼承於需要能夠從獨立視圖模型訪問屬性的視圖模型。在我的具體情況下,它是一個CardViewModel,需要獲取有關當前登錄用戶的信息(處理並存儲在獨立的UserViewModel中)以調用Web服務。 – 2010-04-23 15:48:43

回答

34

您可以使用Messenger來做到這一點: 發送用戶在UserViewModel:

Messenger.Send<User>(userInstance); 

將只發送用戶感興趣的人。

並註冊在你的CardViewModel收件人:在UserViewModel

Messenger.Send<String, UserViewModel>("Gimme user"); 

並做出反應的是::

Messenger.Register<User>(this, delegate(User curUser){_curUser = curUser;}); 

,或者你可以從你的CardViewModel還發送請求喊用戶

Messenger.Register<String>(this, delegate(String msg) 
{ 
if(msg == "Gimme user") 
Messenger.Send<User>(userInstance); 
}); 

(您最好在實際場景中使用枚舉而不是字符串: ))

Perhabs你甚至可以直接回應,但我目前無法檢查它。

只是檢查了這一點:Mvvm light Messenger

+0

完美,這就是我所需要的。 (現在看起來很明顯,它讓我覺得自己像個白癡......)。 謝謝你和我們巴西。 – 2010-04-24 14:24:34

+0

歡迎您:)和我們一起努力! – CodeWeasel 2010-04-27 18:16:57

4

另一種方法是使用RaisePropertyChanged的重載還播放了變化。在用戶

RaisePropertyChanged(() => MyProperty, oldValue, newValue, true); 

然後:你這樣做

Messenger.Default.Register<PropertyChangedMessage<T>>(this, Handler); 

其中T是myProperty的類型。

乾杯 洛朗

0

另一種方式來看待這個問題是有一個返回「當前登錄的用戶」的服務。

處理登錄人員的責任更多地是服務的責任,ViewModels保持簡單。

ViewModels應該只存在於View中。但是,作爲優秀的公民,他們還可以爲Laurent和CodeWeasel等其他ViewModel提供幫助。