Template10 MVVM IoC将ViewModel注入Shell视图

Template10 MVVM IoC将ViewModel注入Shell视图,mvvm,uwp,inversion-of-control,template10,Mvvm,Uwp,Inversion Of Control,Template10,我正在寻找将ViewModel注入Shell视图的最佳方法 我使用的是Autofac(但如果有示例,我可以采用其他IoC容器中的代码)。我已经正确地注入了其他虚拟机-但是使用App类的resoleformage方法解析虚拟机的方法 我是UWP开发的新手,非常感谢您的帮助 将ViewModel传递给Shell确实比传递给其他页面更简单,因为Shell是唯一由我们显式创建的页面:因此,向ShellViewModel类型的Shell的构造函数添加一个参数就足够了: public Shell()

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

我使用的是Autofac(但如果有示例,我可以采用其他IoC容器中的代码)。我已经正确地注入了其他虚拟机-但是使用App类的resoleformage方法解析虚拟机的方法


我是UWP开发的新手,非常感谢您的帮助

将ViewModel传递给Shell确实比传递给其他页面更简单,因为Shell是唯一由我们显式创建的页面:因此,向ShellViewModel类型的Shell的构造函数添加一个参数就足够了:

    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,与其他任何页面一样(主要在xaml中使用x:Bind绑定时有用):

现在,当您创建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()),
        };
    }

当然要用代码替换新的ShellViewModel(),以便从Autofac中提取新的ShellViewModel。

您能分享一些代码吗?
    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()),
        };
    }