在点击加载应用设置的用户按钮后,我的应用程序正在进入休息模式。我已在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();
}
不幸的是,将viewmodel传递给用户控件的构造函数是不可能的,但是几乎没有办法解决它。最重要的是建立组合DI和XAML时,MVVM只是将视图模型注册到容器中。
评论中提到了夫妻选项:
public School()
{
InitializeComponent();
_viewModel = Bootstrap.Container.Resolve<MainSchoolSetupViewModel>();
...
跳过DI,而是在XAML中创建viewmodel实例:<UserControl.DataContext> <local:SchoolViewModel/> </UserControl.DataContext>
但是你很可能想要其他的可能性:
主要思想是您创建一个新的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。