【问题标题】:MVVM light - how to access property in other view modelMVVM light - 如何访问其他视图模型中的属性
【发布时间】:2011-02-11 13:29:41
【问题描述】:

我正在使用 mvvm light 来构建 Silverlight 应用程序。 是否有代码 sn-p 显示如何从另一个视图模型或用户控件的代码中访问视图模型的属性或命令?

我想这很简单,但我不知何故错过了一些东西。

乌力

【问题讨论】:

  • 这取决于您的控件的实现。您是在父视图下的视图之间共享 ViewModel,还是只是尝试在两个独立视图之间共享属性/命令?
  • 有问题的视图可以嵌套在不同的视图中,但它依赖于需要能够从独立视图模型访问属性的视图模型。在我的具体情况下,它是一个 CardViewModel,它需要获取有关当前登录用户的信息(处理并存储在独立的 UserViewModel 中)以调用 Web 服务。

标签: silverlight mvvm mvvm-light


【解决方案1】:

您可以使用 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

【讨论】:

  • 完美,这正是我所需要的。 (现在看起来很明显,让我觉得自己像个白痴……)。 Dankä ond n Gruess us Brasilie。
【解决方案2】:

另一种方法是使用 RaisePropertyChanged 的​​重载,它也会广播更改。你会这样做:

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

然后在订阅者中:

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

其中 T 是 MyProperty 的类型。

干杯 洛朗

【讨论】:

    【解决方案3】:

    查看问题的另一种方法是让服务返回“当前登录的用户”。

    无论如何,处理谁登录的责任更多是服务的责任,并且 ViewModel 保持简单。

    ViewModel 应该只存在于视图中。但是,作为好公民,他们还可以为 Laurent 和 CodeWeasel 等正在展示的其他 ViewModel 提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2019-10-03
      • 1970-01-01
      相关资源
      最近更新 更多