如何从MVVMLight中的ViewModel中获取View(调用链从ViewModel开始)

时间:2014-02-25 13:04:41

标签: c# wpf mvvm mvvm-light

我的情况是我的视图应该执行与UI相关的操作(例如序列化UI布局或COM调用,...)我想发送消息并从我的ViewModel.So中的UI获取该计算。如何从消息发送中获取输出?

1-使用回调方法作为Message的参数,并从视图中回调它。

2-在ViewModel中放置一个属性,并设置此属性以响应View中的消息调用。

我更喜欢第一个,是不是?任何其他方式?

似乎不清楚但是ViewModel中的调用链启动意味着我需要模拟类似于函数调用形式ViewModel来查看并获取此调用的结果。

3 个答案:

答案 0 :(得分:2)

我会在这里做得非常简单:只需从View中调用ViewModel的方法。


编辑:

我不喜欢MVVM中的消息,我经常喜欢事件。所以我将使用的简单方法是:

  • ViewModel公开公共事件。
  • View将处理程序附加到ViewModel的事件。
  • ViewModel引发事件
  • View执行处理程序(代码隐藏)并且:
    • 调用ViewModel的公共方法
    • 调用事件处理程序
    • 的EventArgs参数中包含的回调

如果您不喜欢事件并喜欢消息,那就是相同的:它是回调与公共方法/属性(这里我总是更喜欢方法 vs 属性设置器,因为我不喜欢在setter中添加硬逻辑和异常管理。)

所以回答这个问题:我会选择更简单的IMO公共方法。

答案 1 :(得分:1)

为了访问active-X / COM控件,我倾向于在VM上有一个控件引用,当控件加载时,该控件引用由代码中的视图设置。然后,VM可以直接调用任何方法。

不理想,但Active-X不适合MVVM,因为它包含视图和逻辑。

答案 2 :(得分:0)

您可以使用

等信息传递服务

宣布一个班级

public class HandleClass
{
  public object Obj{get;set;}
  public  HandleClass(object _obj)
  {
   Obj=_obj;
   }
}

现在从ViewModel发送消息

Messanger.Default.Send<HandleClass>(new HandleClass(){Obj=AssignedValue});

现在收到您想要对象信息的消息

Messanger.Default.Register<HandleClass>(this,ReceivedInformation)
private Void ReceivedInformation(HandleClass handle)
{
you can get the Obj object with full of information you can access like
var abc=handle.Obj;
}