MVVM Light - 如何在另一个视图模型中访问属性

15

我正在使用mvvm light构建Silverlight应用程序。 是否有一段代码片段展示如何从另一个视图模型或用户控件的代码后台访问视图模型的属性或命令?

我猜这很简单,但我可能错过了某些东西。

Ueli


这取决于您控件的实现方式。您是在父视图下共享 ViewModel 的视图之间共享,还是仅尝试在两个独立视图之间共享属性/命令? - Jeff Wain
所涉及的视图可以嵌套在不同的视图中,但它依赖于一个视图模型,该视图模型需要能够访问来自独立视图模型的属性。在我的具体情况下,这是一个CardViewModel,它需要获取有关当前登录用户的信息(由独立的UserViewModel处理和存储),以便调用Web服务。 - Ueli Sonderegger
3个回答

34
您可以使用 Messenger 来完成此操作: 在 UserViewModel 中向用户发送消息:
Messenger.Send<User>(userInstance);

我会把用户发送给任何感兴趣的人。

并在您的CardViewModel中注册一个接收者:

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

或者你也可以从你的CardViewModel发送一个请求来喊叫用户:

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

并在UserViewModel中对此进行反应:

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

(在实际场景中最好使用枚举而不是字符串 :) )

也许你甚至可以直接响应,但我现在无法检查。

只需查看此内容:Mvvm light Messenger


完美,这正是我所需要的。(现在看起来如此明显,以至于让我感觉像个白痴...)。 来自巴西的问候。 - Ueli Sonderegger

4
另一种方法是使用 RaisePropertyChanged 的重载函数来广播更改。您可以这样做:
RaisePropertyChanged(() => MyProperty, oldValue, newValue, true);

然后在订阅者中:

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

T是MyProperty的类型。

祝好 Laurent


0

从另一个角度看待这个问题是创建一个返回“当前登录用户”的服务。

处理谁已登录的责任本来就更应该由服务承担,而ViewModels保持简单。

ViewModels只应存在于View中。但是,作为良好的开发者,他们也可以像Laurent和CodeWeasel所展示的那样为其他ViewModels提供帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接