Wpf 在MVVM中创建ViewModel的最佳位置

Wpf 在MVVM中创建ViewModel的最佳位置,wpf,mvvm,viewmodel,virtual-machine,Wpf,Mvvm,Viewmodel,Virtual Machine,我有一个问题:在MVVM中创建ViewModel的最佳位置是哪里?如何创建 1) 在App.xaml.cs中创建一次作为静态字段,然后通过App使用它 2) 导航到此页面时,是否始终在Page.cs中创建新的ViewModel 3) 其他选项您可以使用依赖项注入并像这样创建它(假设您使用的是一些DI容器): 有不同的方法,这取决于你的想法 我个人总是有一个类设计用来创建我需要的所有对象,在App.xaml.cs中调用。 该类基本上在显示splashscreen时执行那些耗时的启动过程。我在这里创

我有一个问题:在MVVM中创建ViewModel的最佳位置是哪里?如何创建

1) 在App.xaml.cs中创建一次作为静态字段,然后通过App使用它

2) 导航到此页面时,是否始终在Page.cs中创建新的ViewModel


3) 其他选项

您可以使用依赖项注入并像这样创建它(假设您使用的是一些DI容器):


有不同的方法,这取决于你的想法

我个人总是有一个类设计用来创建我需要的所有对象,在
App.xaml.cs
中调用。 该类基本上在显示splashscreen时执行那些耗时的启动过程。我在这里创建视图和视图模型并链接它们

这允许我有一个且只有一个点,其中创建了视图到ViewModel的所有链接,我可以很容易地返回到它,即使我添加/删除了一些内容

我不喜欢在每个视图的构造函数中初始化viewModel的方法。假设项目中有15个视图,如果要检查所有ViewModel初始化,则需要浏览15个不同的文件

这是我对MVVM的谦虚参与,ViewModel就是应用程序。这意味着我通常有一个单一的启动视图模型,它是我的应用程序的入口点,我通常在App.xaml.cs
OnStartup
code中创建一个实例

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    var app = new ShellView();
    var context = new ShellViewModel();
    app.DataContext = context;
    app.Show();
}
每隔一段时间,我就会有一个应用程序在启动窗口的构造函数中创建ViewModel,但这并不是首选,因为这意味着如果我有任何启动逻辑,我也必须将其放在视图后面的代码中,我不喜欢在我的视图层中混合应用程序逻辑

public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ShellViewModel();
    }
}

无论您如何操作,请记住,在使用MVVM时,ViewModels是您的应用程序,而不是视图,因此通常您的ViewModels以某种方式连接到启动ViewModel。视图只是用户与应用程序(ViewModels)交互的一种用户友好的方式。

我一直认为它与视图创建是分不开的。当有许多具有不同ViewModels的视图时,这是如何工作的?OnStartup方法是否设置了所有DataContext?创建新视图时会发生什么?嗨,Adrian,通常我只会像这样连接主
ShellView
ShellViewModel
。我告诉WPF如何通过在应用程序的
.Resources
中的某处放置隐式
数据模板来绘制其余的ViewModels。当WPF绘制一个ViewModel时,它会检查是否有一个它应该用来绘制该ViewModel的
DataTemplate
,如果有,就使用它。谢谢。我需要同事的帮助来解包,因为我曾设想数据模板只用于ItemsControl。我也会这么做。但是,假设您需要从视图中显示另一个UserControl或对话框,那么如何在不传递DI容器的情况下为它们提供ViewModel呢?只要容器注册了它们,它们就可以被注入到它们的构造函数中。另一种选择可能是让视图传递某些内容或在其他视图上设置属性?是的,但是将视图注入到ViewModels会创建对我试图避免的表示层的依赖。在ViewModel中引发某种事件,让一些外部实例(可能是控制器)创建并显示需要显示的视图如何?我不是说将视图注入ViewModel。至于事件,我认为您可以引发一个事件,可能使用viewmodel作为负载,然后从中加载usercontrol。啊,对不起,我当时搞错了。您的意思是通过YourView的构造函数注入应该由YourView打开的视图吗?
public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ShellViewModel();
    }
}