【问题标题】:Silverlight - communicate between viewmodelsSilverlight - 视图模型之间的通信
【发布时间】:2012-06-28 02:20:35
【问题描述】:

此 UI 由 Main.xaml 组成,其中包含一个导航框架,其中包含 (Person.xaml),因此涉及两个不同的视图模型。

我想在点击 Main.xaml 中的菜单时过滤数据网格的内容。

  • 人物(显示全部)
  • 50分以上
  • 分数低于 50

我的方法是通过让 PersonViewModel 订阅从 MainViewModel 发送的特定消息来使用 MVVM 轻型消息传递。这可行,但有没有其他方法可以做到这一点(最佳实践)?

如果有更好的方法来解决这个问题,我不想为来自不同视图模型的 UI 元素需要通信的所有场景实现 MvvmLight 消息传递。

【问题讨论】:

  • 在路由事件主干中的silverlight中缺少接口,这可以通过在viewmodel的构造函数上传递IInputElement在WPF上很好地实现,然后使用它来传递消息ANYWHERE(view/viewmodel)。在这里看到这个想法stackoverflow.com/a/11068208/212706

标签: silverlight mvvm mvvm-light


【解决方案1】:

如果您使用的是 MVVM 灯光,我猜您已经在 ViewModelLocator 中创建了这些视图模型。因此,只需使用它来访问应用程序中的视图模型即可。

另一种方法是使用某种类型的 IoC 容器,例如 Unity 或 SimpleIoC。

希望对你有帮助。

【讨论】:

  • 我想我会采用这种方法。谢谢!
  • 无法在我的视图模型基础上实现 ICommand 是解决此问题的一种方法
【解决方案2】:

我们也使用 MVVM 灯。根据我对您的要求的理解。您可能只使用一个 DomainContext ,然后将所有实体加载到它,然后查询每个点击项的上下文。

一旦你有了一个上下文,你基本上可以动态地查询它。这是我的代码之一。

 GetUserBUGroups = SecurityDomainContext.Current.UserBUGroups.Where(ub => ub.UserID == GetUsers.UserID).OrderBy(o => o.BUGroup.BUGroupDesc).ToList();

【讨论】:

  • 解决问题的有趣方法!我从没想过这是一个可能的解决方案:)
【解决方案3】:

对于这样的简单场景,使用多个 ViewModel 似乎并不合适。 我相信您应该直接在 PersonViewModel 中插入过滤器选项

【讨论】:

  • 这只是一个例子,真正的应用程序在navigation:Frame中会有几个视图,所以左边的菜单必须与navigation:Frame中的视图所在的任何viewmodels进行通信绑定到。
猜你喜欢
  • 2011-03-01
  • 2015-02-11
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
相关资源
最近更新 更多