2010-04-23 44 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提供帮助。

相关问题