MvvmLight良好实践:通过ViewModel显示表单

时间:2012-12-06 07:07:06

标签: wpf mvvm mvvm-light

我是WPF,MVVM的新手。现在,我一直在调查MVVM Light。我有些困惑。我感谢各位的帮助。提前感谢您看一下这篇文章。

  1. 我们是否可以绝对删除View后面的代码(例如:在.xaml内部调用InitializeComponent() - >在某些简单的情况下不再需要view.xaml.cs。)

    < / LI>
  2. 我的项目有很多见解,需要多少定位器? 我打算为每个视图制作单独的定位器。我想知道如果我在app.xml中注册所有定位器,是否在用户运行应用程序后立即初始化并注册了所有视图?如果是,那是否对表现不利?

  3. 主要问题: 我有一个场景: 我有很多形式:例如:

    1. MainForm:这是应用程序调用的第一个表单。
    2. ImportForm:在用户点击导入(来自MainForm)
    3. 时调用
  4. 假设:我确实完成了与绑定相关的所有内容(例如按钮导入 - &gt; RelayCommand(OnImport)) 对我来说,实施此方案的最佳做法是什么? 1.只需实现init并显示ImportForm,如下所示:

    public void OnImport()
    {
       ImportForm importForm = new ImportForm();
       importForm.ShowDialog();
    }
    

    这很简单,但我想知道这种方式是否遵循MVVM的范式?

    1. 所以,我做了一些研究,并采取了另一种方式:

      public void OnImport() {    ////只需发送消息    Messenger.Default.Send(       new NotificationMessage(this,“OnImport”)); }

    2. 在Code Behind中:MainForm.xaml.cs

      public MainForm()
          {
              InitializeComponent();
              Messenger.Default.Register<NotificationMessage>(this, (nm) =>
              {
                 if (nm.Sender == this.DataContext)
                 {    
                      if (nm.Notification == "OnImport")
                      {  
                          ImportForm importForm = new ImportForm();
                          importForm.ShowDialog();
                      }
                 }
              });
          }
      

      通过这种方式,我必须在代码后面编写一些代码 - &gt;这是一个问题吗?

      以上两种解决方案都可以正确完成上述方案,但我觉得哪一个更好或者是否有正确的解决方案?

      再次感谢您对长期问题的耐心。

1 个答案:

答案 0 :(得分:1)

  1. 不,你不能。 InitializeComponent()在屏幕上绘制UI。 MVVM的目的是分离与View无关的逻辑并将其存储在ViewModel中。它不倾向于或旨在删除代码隐藏。
  2. 这取决于你。您可以为每个ViewModel创建一个Locator或为每个ViewModel创建一个Locator。无论如何,我发现Locator在一个更大的项目中不能很好地扩展和难以管理。它在View,Locators和ViewModels之间创建依赖关系。我个人更喜欢使用DI框架而不是Locator,即使它是一个小项目。
  3. 你可以两者兼顾,取决于你的要求。 (a)如果单击主窗体上的按钮只会显示一个对话框,那么我会使用Click事件,因为它与View相关。它与任何逻辑无关,因此将其保留在代码背后对我来说是最好的解决方案。 (b)顺便说一句,如果单击按钮执行某些操作,例如,连接到数据库,则在条件为真时显示对话框。在这种情况下,我会使用Messenger来保持View和ViewModel彼此分离。