2

我是 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. 所以,我做了一些研究并做了另一种方式,比如:

    public void OnImport() { //// 只发送消息 Messenger.Default.Send(new 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();
                }
           }
        });
    }

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

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

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

4

1 回答 1

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 分开。
于 2012-12-06T07:41:34.193 回答