0 c# wpf prism unity-container mvvm
我在使用MVVM的wpf应用程序中使用Prism + Unity。我是Prism和Unity的初学者。
我希望能够关闭当前视图。我读过的各种解决方案和文章都指出,做到这一点的最佳方法是从视图模型中进行。但是视图模型需要一个区域管理器对象才能关闭视图。好的,让我们设置构造函数注入。以前从未尝试过,但是关于SO的问题很多。
首先让我解释一下如何将事物连接在一起。我有一个引导程序类,用于处理类型和实例的注册。
这是我的视图模型的注册方式:
container.RegisterType<IViewModel, ViewAccountsViewModel>(new InjectionConstructor(new ResolvedParameter(typeof(RegionManager))));
container.RegisterType<ViewAccountsView>();
Run Code Online (Sandbox Code Playgroud)
这是视图帐户视图的模块:
public class ViewAccountsModule : IModule
{
private readonly IRegionManager regionManager;
private readonly IUnityContainer container;
public ViewAccountsModule(IUnityContainer container, IRegionManager regionManager)
{
this.container = container;
this.regionManager = regionManager;
}
/// <summary>
///
/// </summary>
public void Initialize()
{
regionManager.RegisterViewWithRegion("MainRegion", () => this.container.Resolve<ViewAccountsView>());
}
}
Run Code Online (Sandbox Code Playgroud)
在我的ViewAccountsView.xaml中,我像这样设置数据上下文:
<Grid.DataContext>
<vm:ViewAccountsViewModel/>
</Grid.DataContext>
Run Code Online (Sandbox Code Playgroud)
而我的视图模型构造函数:
[InjectionConstructor]
public ViewAccountsViewModel(IRegionManager regionManager)
{
if (regionManager == null) throw new ArgumentNullException("regionManager");
this.regionManager = regionManager;
}
Run Code Online (Sandbox Code Playgroud)
编译解决方案时,收到错误消息“ ViewAccountsViewModel”类型不包含任何可访问的构造函数。如果将默认构造函数添加到视图模型中,则会显示该视图,但无法从区域中删除该视图。我收到一个参数null异常。
这是删除视图的代码:
regionManager.Regions["MainRegion"].Remove(regionManager.Regions["MainRegion"].GetView("ViewAccountsView"));
Run Code Online (Sandbox Code Playgroud)
我仍然是IoC和DI的初学者。有什么我想念的吗?
小智 5
Unity将为您注入所有它知道的依赖项。默认情况下,Unity将使用最多的参数调用构造函数。通常,您可以使用InjectionConstructor告诉Unity在为您创建对象时选择其他构造函数,或者如果您想向其传递自定义参数。
注册:
container.RegisterType<IViewModel, ViewAccountsViewModel>();
// If you plan to have multiple IViewModels, it will need to have a name
// container.RegisterType<IViewModel, ViewAccountsViewModel>("ViewAccountsViewModelName");
container.RegisterType<ViewAccountsView>();
Run Code Online (Sandbox Code Playgroud)
ViewModel:
// If you decide later you need other dependencies like IUnityContainer, you can just set
// it in your constructor and Unity will give it to you automagically through the power
// of Dependency Injection
// public ViewAccountsViewModel(IRegionManager regionManager, IUnityContainer unityContainer)
public ViewAccountsViewModel(IRegionManager regionManager)
{
this.regionManager = regionManager;
}
Run Code Online (Sandbox Code Playgroud)
查看后面的代码:
// If you have a named IViewModel
// public ViewAccountsView([Dependency("ViewAccountsViewModelName")]IViewModel viewModel)
public ViewAccountsView(IViewModel viewModel)
{
this.InitializeComponent();
this.DataContext = viewModel;
}
Run Code Online (Sandbox Code Playgroud)