在MVVM应用程序中使用autofac

问题描述 投票:0回答:1

在点击加载应用设置的用户按钮后,我的应用程序正在进入休息模式。我已在bootstrapper类中注册了该组件。

如何在bootstrap类中注册用户控制器的构造函数以避免中断?

public class Bootstrapper
{
    public IContainer Bootstrap()
    {
        var builder = new ContainerBuilder();

        builder.RegisterType<LoginView>().AsSelf();
        builder.RegisterType<SchoolSectionDataService>().As<ISchoolSectionDataService>();
        builder.RegisterType<AdminView>().AsSelf();

        builder.RegisterType<School>().AsSelf();
        builder.RegisterType<MainSchoolSetupViewModel>().AsSelf();

        return builder.Build();
    }
}

用户控件是:

private MainSchoolSetupViewModel _viewModel;

public School(MainSchoolSetupViewModel schoolSetupViewModel)
{
    InitializeComponent();
    _viewModel = schoolSetupViewModel;
    DataContext = _viewModel;
    Loaded += UserControl_Loaded;
}

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    _viewModel.Load();
}
c# wpf xaml mvvm autofac
1个回答
0
投票

不幸的是,将viewmodel传递给用户控件的构造函数是不可能的,但是几乎没有办法解决它。最重要的是建立组合DI和XAML时,MVVM只是将视图模型注册到容器中。

评论中提到了夫妻选项:

  1. 在Bootstrap中添加静态IContainer属性。在用户控件的构造函数中调用它来获取VM: public School() { InitializeComponent(); _viewModel = Bootstrap.Container.Resolve<MainSchoolSetupViewModel>(); ... 跳过DI,而是在XAML中创建viewmodel实例:
<UserControl.DataContext>
   <local:SchoolViewModel/>
</UserControl.DataContext>

但是你很可能想要其他的可能性:

  1. 使用ViewModelLocator帮助解决DI问题。这个答案中有很好的记载:https://stackoverflow.com/a/25524753/66988

主要思想是您创建一个新的ViewModelLocator类:

class ViewModelLocator
{
    public SchoolViewModel SchoolViewModel
    {
        get { return Bootstrap.Container.Resolve<SchoolViewModel>(); } 
    }
}

并在App.xaml中创建它的静态实例,并使用它来创建用户控件的数据上下文:

DataContext="{Binding SchoolViewModel, Source={StaticResource ViewModelLocator}}">

对于其他解决方案,一个选项是查看某些MVVM框架的源代码,例如Caliburn.Micro。从Caliburn.Micro您可以找到您可能感兴趣的ViewModelLocator和ViewLocator。

© www.soinside.com 2019 - 2024. All rights reserved.