6

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

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

2) 当我导航到这个页面时,总是在 Page.cs 中创建新的 ViewModel?

3) 其他选项

4

3 回答 3

11

在 MVVM 中,ViewModel应用程序。这意味着我通常有一个启动 ViewModel 作为我的应用程序的入口点,我通常在 App.xaml.csOnStartup代码中创建它的一个实例

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

    var app = new ShellView();
    var context = new ShellViewModel();
    app.DataContext = context;
    app.Show();
}

每隔一段时间,我就有一个应用程序会在启动窗口的构造函数中创建 ViewModel,但这并不是真正的首选,因为这意味着如果我有任何启动逻辑,我也必须将它放在 View 的代码隐藏中,而且我不喜欢在我的视图层中混合应用程序逻辑。

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

不管你怎么做,请记住,当使用 MVVM 时,你的 ViewModel 是你的应用程序,而不是你的 View,所以通常你的 ViewModel 以某种方式连接到启动 ViewModel。视图只是用户与您的应用程序(ViewModel)交互的一种用户友好的方式。

于 2012-09-19T19:14:22.667 回答
2

有不同的方法可以做到这一点,取决于你的想法。

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

这使我只有一个点来创建所有这些 View-to-ViewModel 链接,即使我添加/删除某些内容,我也可以轻松地回到它。

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

这是我对此的谦虚参与=)

于 2012-09-19T19:02:30.193 回答
1

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

 public partial class YourView : UserControl
{
    public YourView (IYourViewModel viewModel)
    {
        InitializeComponent();
        this.DataContext = viewModel;
    }
}
于 2012-09-19T18:55:50.570 回答