Template10 MVVM IoC将ViewModel注入Shell视图

时间:2017-06-30 01:23:03

标签: mvvm uwp inversion-of-control template10

我正在寻找将ViewModel注入Shell视图的最佳方法。

我正在使用Autofac(但如果样本可用,我可以采用其他IoC容器中的代码)。我有其他虚拟机正确注入 - 但是使用App类的ResoleForPage方法解析VM的方法。

我对UWP的发展很新,非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

将ViewModel传递给Shell确实比将其传递给其他页面更简单,因为Shell是我们唯一创建的唯一页面:因此,应该足以将参数添加到Shell的构造函数中类型ShellViewModel:

    public Shell()
    {
        Instance = this;
        this.InitializeComponent();
    }

    public Shell(INavigationService navService, ShellViewModel model) : this()
    {
        navigationMenu.NavigationService = navService;
        navigationMenu.RefreshStyles(App.Current.RequestedTheme, true);
        this.DataContext = model;
    }

然后以强类型方式公开DataContext,与任何其他页面一样(主要用于x:绑定xam中的绑定):

    public ShellViewModel ViewModel => DataContext as ShellViewModel;

现在,您只需要在创建Shell时传递ViewModel类的实例,从IoC容器中提取它。在VS2017的最新模板10模板中,它应该在App类的CreateRootElement方法中:

    public override UIElement CreateRootElement(IActivatedEventArgs e)
    {
        var service = NavigationServiceFactory(BackButton.Attach, ExistingContent.Include);
        return new Template10.Controls.ModalDialog
        {
            DisableBackButtonWhenModal = true,
            Content = new Shell(service, new ShellViewModel()),
        };
    }

当然用代码替换new ShellViewModel()以从Autofac中提取它。