有关MVVM最佳设计的咨询

时间:2015-10-19 06:39:10

标签: c# design-patterns mvvm

小问题。我正在进行MVVM设计模式(C#)。 View是一个Excel加载项,我想从View_Model运行一个在View中找到的方法。我想到了两种方式:

  1. 在View Model中保持一个指向View的指针(指针类型是View和View_Model继承的接口,否则我会得到循环独立,因为View持有View_Model而View_Model持有View),然后直接从他那里运行方法。
  2. 在View_Model中创建一个事件,并在View中已经拥有的View_Model指针中查看该事件中的方法,并在我想运行此方法时引发事件。
  3. 不知怎的,2号路的感觉就像在街上尖叫一样只有一个人而不是直接跟他说话。另一方面,第2号方法的优势在于,如果我将来有其他与此操作相关的方法,我可以将它们签名到该事件而不是专门调用它们。

    你会做什么?

2 个答案:

答案 0 :(得分:1)

方法1打破了MVVM原则,因为视图模型不应该知道视图。你的方法有点像MVP设计模式。

我想说方法2是更好的方法,对于查看视图模型的视图来说完全没问题。它还使您可以灵活地在引发该事件时执行任何操作,例如,如果您想使用其他视图并调用其他方法。

此外,可以使用良好的消息传递框架来完成此类事情。视图模型发布消息,视图订阅它。 mvvmlight框架工作有很好的实现,但我相信还有其他的。

答案 1 :(得分:0)

接受一个接口,从中实现视图。并通过传递此视图来实例化viewmodel。

让我们说 -

接口

public interface IFooView
{
   ...
}

查看

public Class FooView : IFooView
{
   private FooViewModel _viewModel; 
   public FooView()
   {
      _viewModel = new FooViewModel(this);
   }
}

视图模型

public class FooViewModel
{
   private FooView _view;
   public FooViewModel(IFooView view)
   {
      _view = view;
   }
}

现在,您可以从View调用ViewModel,也可以从ViewModel调用。