点击加载应用程序设置的用户按钮后,我的应用程序将进入中断模式。我已在 Bootstrap 类中注册了该组件。
如何在引导类中注册用户 Controller 的构造函数以避免中断?
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();
}
最佳答案
不幸的是,将 View 模型传递到用户控件的构造函数中是不可能的,但解决它的方法很少。通常最重要的是,在结合 DI 和 XAML 和 MVVM 进行构建时,只有 View 模型会注册到容器中。
评论中提到了几个选项:
在 Bootstrap 中添加静态 IContainer 属性。在用户控件的构造函数中调用它来获取 VM:
public School() { InitializeComponent(); _viewModel = Bootstrap.Container.Resolve<MainSchoolSetupViewModel>(); ...
- 跳过 DI,而是在 XAML 中创建 View 模型实例:
<UserControl.DataContext> <local:SchoolViewModel/> </UserControl.DataContext>
但您很可能希望还有其他可能性:
- 使用 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。
关于c# - 在 MVVM 应用程序中使用 autofac,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49032232/