【问题标题】:Silverlight - MVVM friendly way way to pass parameter into embedded user control?Silverlight - 将参数传递到嵌入式用户控件的 MVVM 友好方式?
【发布时间】:2011-03-14 10:08:49
【问题描述】:

场景如下:

我有一个“订单查找”用户控件,允许用户浏览订单并选择一个。订单查找用户控件嵌入了一个“订单详细信息”用户控件,在选择订单之前它是不可见的,此时它会显示订单详细信息。

问题是 - 如何将选定的 OrderID 传递给订单详细信息用户控件并从订单查找用户控件中获取要加载的订单(即设置订单详细信息视图模型的 CurrentOrderID 属性,并调用它的 LoadOrder 方法),在一种 MVVM 友好的方式(即没有对任一用户控件控件的代码引用)。

如果我可以从订单查找的视图模型中引用订单详细信息的视图模型的活动实例,那将很简单,但我不知道该怎么做。

我目前的方法是将 CurrentOrderID 属性设为静态(这样我就可以从订单查找的视图模型中设置它,而无需参考订单详细信息的视图模型的活动实例),并在订单详细信息中运行一个间隔为 1 秒的计时器viewmodel 检查 CurrentOrderID 属性的变化。然而,这有难闻的气味和一些不必要的副作用!

【问题讨论】:

  • UserControls 是同一个视图的一部分吗?您使用的是 MVVM-light 还是类似的东西?
  • 分离视图。全部手工编码 - 没有框架。

标签: wpf mvvm silverlight-4.0 user-controls


【解决方案1】:

您应该有两个视图和两个 ViewModel。然后,根据您使用的 MVVM 框架(如果有),您应该使用消息传递机制在 ViewModel 之间交换数据(中介者模式)。

Orders VM 发送选择 Order 已更改的消息(通过 Messenger),OrderDetail VM 收到此消息并做出相应反应。

Messenger 一方面负责订阅接收者,另一方面负责发送给订阅者。所以不需要定期检查任何东西,它应该是基于事件的。

考虑使用例如 MVVM Light 及其 Messenger 类:

http://mvvmlight.codeplex.com/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 2012-08-01
    • 2012-03-21
    • 1970-01-01
    • 2011-10-02
    • 2011-06-10
    • 1970-01-01
    相关资源
    最近更新 更多