【问题标题】:MvvmLight Good Practice : Show a Form by a ViewModelMvvmLight 良好实践:通过 ViewModel 显示表单
【发布时间】:2012-12-06 07:07:06
【问题描述】:

我是 WPF 和 MVVM 的新手。现在,我一直在研究 MVVM Light。我有些困惑。我感谢你们所有人的帮助。提前感谢您查看这篇文章。

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

    李>
  2. 我的项目有很多视图,需要多少定位器? 我打算为每个视图制作单独的定位器。而且我想知道如果我在 app.xml 中注册所有定位器,是否所有视图都在用户运行应用程序后立即初始化和注册?如果是,是否对性能不利?

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

    1. MainForm:这是应用程序调用的第一个表单。
    2. ImportForm:当用户单击 Import(从 MainForm)时调用

假设:我确实完成了与绑定相关的所有内容(例如按钮 Import --> RelayCommand(OnImport)) 我实施此方案的最佳做法是什么? 1. 只需执行初始化并显示 ImportForm 如下所示:

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

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

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

    公共无效 OnImport() { //// 只发送消息 Messenger.Default.Send( 新的 NotificationMessage(this, "OnImport")); }

在代码后面: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();
                }
           }
        });
    }

这样一来,我必须在后面的代码里面写一些代码 --> 有问题吗?

上述两种解决方案都可以正确完成上述场景,但我混淆了哪一种更好,或者那里有任何真正正确的解决方案?

再次感谢您耐心解答这个冗长的问题。

【问题讨论】:

    标签: wpf mvvm mvvm-light


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

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      相关资源
      最近更新 更多