Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 从视图模型中的按钮单击调用第二个视图_Wpf_Mvvm_Castle Windsor - Fatal编程技术网

Wpf 从视图模型中的按钮单击调用第二个视图

Wpf 从视图模型中的按钮单击调用第二个视图,wpf,mvvm,castle-windsor,Wpf,Mvvm,Castle Windsor,尝试使用WPF和MVVM设计模式处理Castle Windsor。我的解决方案中有三个项目,即MainView、ViewModel和IoCInstaller项目 MainView依赖于IoCInstaller和ViewModel。 IoCInstaller取决于ViewModel 现在我想从ViewModel中的按钮单击操作调用第二个视图,但基于依赖关系,我发现这很难。我知道我在温莎城堡的实施并不理想,但我并没有找到任何理想的实施方式的好答案。任何建议都会很有帮助 在阅读了文档并在web上搜索之

尝试使用WPF和MVVM设计模式处理Castle Windsor。我的解决方案中有三个项目,即MainView、ViewModel和IoCInstaller项目

MainView依赖于IoCInstaller和ViewModel。 IoCInstaller取决于ViewModel

现在我想从ViewModel中的按钮单击操作调用第二个视图,但基于依赖关系,我发现这很难。我知道我在温莎城堡的实施并不理想,但我并没有找到任何理想的实施方式的好答案。任何建议都会很有帮助

在阅读了文档并在web上搜索之后,我完成了基本的castle实现工作,但当涉及到WPF和MVVM时,我被卡住了

视图模型项目

public部分类主视图:窗口
{
公共主视图()
{
初始化组件();
var iocContainer=IoCInstaller.WindsorContainer;
安装(新的IoCInstaller());
var mainWindowViewModel=iocContainer.Resolve();
mainWindowViewModel.Initialize(iocContainer);
DataContext=mainWindowViewModel;
}
}
IoCInstaller项目

public类IoCInstaller:IWindsorInstaller
{
私人静态WindsorContainer_WindsorContainer;
公共静态WindsorContainer WindsorContainer
{
得到
{
如果(_windsorContainer==null)
{
_windsorContainer=新windsorContainer();
返回windsorContainer;
}
其他的
{
返回windsorContainer;
}
}
}
public void安装(IWindsorContainer、IConfigurationStore)
{
Register(Castle.MicroKernel.registation.Component.For());
}
}
最后,ViewModel项目

公共类ViewModel:INotifyPropertyChanged,IViewModel
{
公共视图模型()
{
}
公共无效初始化(WindsorContainer WindsorContainer)
{
调试(“初始化主视图模型”);
iocContainer=windsorContainer;
}
public void MyActionForBttnClicked()
{
//调用第二视图
}
//其他东西
}

您当前使用城堡的方式。温莎更像是一个服务定位器,而不是一个IOC容器。
我建议您使用来解析您的类。对于工厂,您不需要使用
公共静态WindsorContainer
,因为您只需调用
Resolve
一次(另请参阅)

首先使用
引导程序
-类调用
IWindsorInstaller
并注册
类型工厂设施的使用:

公共类引导程序
{
公共IWindsorContainer BootstrapContainer()
{
IWindsorContainer=新WindsorContainer();
container.AddFacility();
返回容器。安装(新IocInstaller());
}
}
您可以从
MainView
或从
App.xaml.cs
调用
BootstrapContainer()

现在为您的
视图模型创建一个工厂

公共接口IViewModelFactory { IViewModel Create(); 无效释放(IViewModel viewModel); }
您不需要实施此工厂,温莎将为您执行此操作。
您只需更改
IocInstaller
并注册
IViewModelFactory

public类IocInstaller:IWindsorInstaller
{
public void安装(IWindsorContainer、IConfigurationStore)
{
container.Register(Component.For().ImplementedBy().LifestyleTransient());
container.Register(Component.For().AsFactory());
}
}
确保您熟悉可用的
生活方式
。默认值是
LifestyleSingleton()
,而您可能希望使用
LifestyleTransient()
。有关更多信息,请参阅

要创建您的
ViewModel
,您可以在调用
引导程序的位置调用
Resolve
,并获取
IViewModelFactory

public MainView()
{
//其他东西
Bootstrapper Bootstrapper=new Bootstrapper();
IWindsorContainer=bootstrapper.BootstrapContainer();
IViewModelFactory viewModelFactory=container.Resolve();
IViewModel viewModel=viewModelFactory.Create();
DataContext=viewModel;
}
如果您现在想从
ViewModel
打开另一个窗口,您可以非常轻松地完成此操作。
首先为第二个视图模型创建工厂:

公共接口ISecondViewModelFactory
{
ISecondViewModel创建();
无效释放(ISecondViewModel secondViewModel);
}
然后在
IocInstaller
中注册新类:

public类IocInstaller:IWindsorInstaller
{
public void安装(IWindsorContainer、IConfigurationStore)
{
//ViewModel的注册
container.Register(Component.For().ImplementedBy().LifestyleTransient());
container.Register(Component.For().AsFactory());
}
}
现在可以将新的
ISecondViewModelFactory
设置为
ViewModel
的构造函数的参数:

公共类ViewModel:INotifyPropertyChanged,IViewModel
{
私有只读ISecondViewModelFactory\u secondViewModelFactory;
公共视图模型(ISecondViewModelFactory第二视图模型工厂)
{
_secondViewModelFactory=secondViewModelFactory;
}
}
Windsor为您解决了ISecondViewModelFactory的问题,因此您不必关心它。
然后,您可以轻松创建一个新的
SecondViewModel
,并在需要时显示一个带有
SecondViewModel
的新窗口