在MVVM中创建ViewModel的最佳位置

时间:2012-09-19 18:45:07

标签: wpf mvvm viewmodel virtual-machine

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

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

使用它

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

3)其他选项

3 个答案:

答案 0 :(得分:9)

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

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是您的应用程序,而不是您的视图,因此通常您的ViewModel以某种方式连接到启动ViewModel。视图只是用户友好的方式,用户可以与您的应用程序(ViewModels)进行交互。

答案 1 :(得分:1)

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

 public partial class YourView : UserControl
{
    public YourView (IYourViewModel viewModel)
    {
        InitializeComponent();
        this.DataContext = viewModel;
    }
}

答案 2 :(得分:1)

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

我个人总是有一个专门用来创建我需要的所有对象的类,在App.xaml.cs中调用。 该类基本上执行那些耗时的启动过程,同时显示启动画面。我在这里创建了Views和ViewModel并将它们链接起来

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

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

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