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

Wpf MvvmLight良好实践:通过ViewModel显示表单,wpf,mvvm,mvvm-light,Wpf,Mvvm,Mvvm Light,我是WPF、MVVM的新手。现在,我一直在研究MVVM灯。我有些困惑。我感谢你们所有人的帮助。提前感谢您阅读这篇文章 我们是否可以完全删除视图背后的代码(例如:在某些简单的情况下,调用.xaml-->中的某个地方的InitializeComponent())不再需要View.xaml.cs) 我的项目有很多视图,需要多少定位器? 我打算为每个视图制作单独的定位器。我想知道,如果我在app.xml中注册所有定位器,是否所有视图都在用户运行应用程序后立即初始化和注册?如果是,是否对性能不好 主要问题

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

  • 我们是否可以完全删除视图背后的代码(例如:在某些简单的情况下,调用.xaml-->中的某个地方的InitializeComponent())不再需要View.xaml.cs)

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

  • 主要问题: 我有一个场景: 我有多种形式:例如:

  • MainForm:这是应用程序调用的第一个表单
  • ImportForm:当用户单击Import(从MainForm)时调用
  • 假设:我确实完成了与绑定相关的所有工作(例如按钮导入-->RelayCommand(OnImport)) 对于我来说,实现这个场景的最佳实践是什么? 1.只需实现init并显示ImportForm,如下所示:

    public void OnImport()
    {
       ImportForm importForm = new ImportForm();
       importForm.ShowDialog();
    }
    
    这很简单,但我想知道这种方式是否遵循MVVM的范例

  • 所以,我做了一些研究,用另一种方式做了如下工作:

    公共无效OnImport() { ////只需发送消息 Messenger.Default.Send( 新的通知消息(本“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();
                    }
               }
            });
        }
    
    public MainForm()
    {
    初始化组件();
    Messenger.Default.Register(此(nm)=>
    {
    if(nm.Sender==this.DataContext)
    {    
    如果(nm.Notification==“OnImport”)
    {  
    ImportForm ImportForm=新的ImportForm();
    importForm.ShowDialog();
    }
    }
    });
    }
    
    通过这种方式,我必须在代码隐藏-->中编写一些代码,这有问题吗

    上述两种解决方案都可以正确地完成上述场景,但我不知道哪一种更好,或者有没有真正正确的解决方案

    再次感谢您对这个长问题的耐心

  • 不,你不能<代码>初始化组件()在屏幕上绘制UI。MVVM的目的是分离与视图无关的逻辑,并将其存储在ViewModel中。它并不倾向于或旨在删除隐藏的代码
  • 这取决于你。可以为所有ViewModel创建一个定位器,也可以为每个ViewModel创建一个定位器。无论如何,我发现定位器的伸缩性不好,在更大的项目中很难管理。它在视图、定位器和视图模型之间创建依赖关系。我个人更喜欢使用DI框架而不是定位器,即使它是一个小项目
  • 根据您的要求,您可以同时执行这两项操作(a)如果单击主窗体上的按钮只显示一个对话框,那么我将使用
    单击
    事件,因为它与视图相关。它与任何逻辑都没有关系,因此将其保留在代码中是我的最佳解决方案(b)顺便说一句,如果单击按钮执行某些操作,例如连接到数据库,则如果条件为真,则显示一个对话框。在本例中,我将使用Messenger使View和ViewModel彼此分离