11

我对 MVVM 模式很陌生,所以请多多包涵。我在 wpf +mvvm + prism 中看到了实现,其中所有视图都倾向于将 IView 作为最顶层的界面。然后各个模块中的视图有一个视图特定的接口,如 IViewA、IViewB 等,它们实现了 IView 接口。甚至 viewmodel 也有 IViewModel 最顶层的接口,并且后续模块有 IViewAViewModel , IViewBViewModel 等继承自 IViewmodel。IViewmodel 具有对 Iview 的引用,而 Iview 具有对 IViewModel 的引用。

namespace xxx.xxx.infrastructure
{
public interface IView
{
  IViewModel ViewModel {get;set;}
}

public interface IViewModel 
{
  IView View {get;set;}
}

public abstract class ViewModelBase : IViewModel, INotifyPropertyChanged
{

   public IView View {get;set;}

   public ViewModelBase(IView view)
   {
     View = view;
     View.ViewModel = this;
   }
   //INotifyPropertyChanged left out
 }
}

namespace xxx.xxx.Modules.Customer
{
   public interface ICustomerDetailsView : IView
   {

   }

   public partial Class CustomerDetailsView : UserControl, ICustomerDetailsView 
   {
       public CustomerDetailsView ()
       {
         InitializeComponent();
       }

       //Is this implementation acceptable?The view is supposed to have zero code in       the code behind.....
        public IViewModel ViewModel
        {
          get
          {
            return (ICustomerDetailsViewViewModel)DataContext; 
          }
          set
          {
             DataContext = value;
          }
        }

    }  

    public interface ICustomerDetailsViewViewModel : IViewModel
    {
       string Message {get;set;}
    }

     public class CustomerDetailsViewViewModel : ViewModelBase,       ICustomerDetailsViewViewModel 
    {
      //Will be injected by unity as i have set up mappings in module initilize.
      public CustomerDetailsViewViewModel(ICustomerDetailsView view)
          :base(view)
      {
      }

       public string Message
       {
          //INotifyPropertyChanged left out for brevity
          get;set;
       }
   }

我有几个问题。

1.)这是否违反了 MVVM,因为文件后面的代码应该是零代码?

2.)在 MVVM 视图模型中不应该担心视图或其合同?上面的实现不会破坏它吗?

3.)我不明白这个实现有什么用。事实上,这与 MVP 接壤,需要大量代码。

4.)如果这是一种可接受的实现方式,我是否需要为所有模块中的所有视图和视图模型提供接口。?

4

2 回答 2

18

首先是 Rachel 关于 viewmodel 的非常好的评论:

请记住,使用 MVVM,您的 ViewModel 就是您的应用程序。View 只是一个漂亮的界面,它允许用户与您的 ViewModel 进行交互。

1) IView 对我来说违反了 MVVM,但对于 ui 的东西当然允许使用代码隐藏。viewmodel 应该没有对视图的引用。见 Hasith 的第一条评论

2)看我的块引用

3)我和你在一起——我从不在我的项目中使用类似的东西

4) 请用简单的方法做 MVVM - 没有耦合,使用 di、ioc、命令、行为,对我来说最重要的是:首先是 viewmodel :)

于 2012-07-13T05:29:45.953 回答
8

基本上,我们只需要用于注入的接口。有2种方式:

  • 将 ViewModel 注入到视图中

这将意味着 ViewModel 不再有任何对 View 的反向引用。这意味着在对 ViewModel 进行单元测试时,您不需要模拟视图。此外,它使代码更清晰,因为在 View 的构造函数中,它只是将 DataContext 设置为注入的 ViewModel。

  • 将视图注入 ViewModel。

它避免将工作流逻辑保留在表示层中。这意味着应用程序层继续负责应用程序工作流程。这样,工作流逻辑与视图高度耦合,因此很难为此编写单元测试。

于 2012-07-13T06:09:48.900 回答