我有两个应用程序,一个是主应用程序,另一个是设计器表单应用程序。将ViewModel替换为另一个ViewModel
目前我有我的主要应用程序与棱镜和mef工作。我的主要应用程序中的一些视图只是数据输入表单。我想从我的设计器表单应用程序加载数据输入表单视图,以便可以编辑,但为此,我想使用不同的视图模型进行设计。我不希望表单附加到它通常的viewmodel并尝试获取数据等。
如何使用MEF我将能够提供不同的导出,以便它选择这个而不是通常的viewmodel?理想情况下,它只会替换主应用程序视图模型,所以它只是用它来代替。
这是我的例子来看,导入一个视图模型
[Export("PatientDetailView")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public partial class PatientDetailView : UserControl
{
[ImportingConstructor]
public PatientDetailView(PatientDetailViewModel viewModel)
{
InitializeComponent();
this.DataContext = viewModel;
}
}
这里是我的视图模型的基础:
[Export(typeof(PatientDetailViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class PatientDetailViewModel : ViewModelBase, IRegionManagerAware
{
[ImportingConstructor]
public PatientDetailViewModel(IEventAggregator eventAggregator, IDialogService dialogService, IRegionManager regionManager)
: base(eventAggregator, dialogService, regionManager)
{
//Contains Commands etc for Saving Patient Detail Record
//Receiving patient detail etc
}
}
UPDATE:
的以上包含在患者模块中部件。这适用于主应用程序。对于设计应用程序,我想的东西,如下面来代替上述视图模型:
[Export(typeof(PatientDetailViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class PatientDetailViewModel : ViewModelBase, IRegionManagerAware
{
[ImportingConstructor]
public PatientDetailViewModel(IEventAggregator eventAggregator, IDialogService dialogService, IRegionManager regionManager)
: base(eventAggregator, dialogService, regionManager)
{
//Contains Commands etc for Designing the form
//No commands from the original VM so changes how it tries to work.
}
}
以上工作来覆盖我的主要应用程序的默认行为。该VM将包含在Designer程序集或独立的designerVMs程序集中。
好酷感谢回复。我的问题是我不知道我只包含我想要的ViewModel。由于主要应用程序虚拟机总是出口,当我包含我的视图的程序集。 我可以导出我的其他虚拟机在我的设计器应用程序,但然后有两个出口,我可以用我的新出口替换此导出? – 2012-04-19 10:41:08
你不能把每个虚拟机放在一个单独的程序集中,并且每个应用程序只包含一个这样的程序集? – stijn 2012-04-19 12:44:52
不是真的,ViewModel应该在同一个程序集中与View一起使用,从来没有在别处看过它们。它是该模块的一部分,对于设计人员而言,在不同的组件中看起来有点不对。我认为MEF是关于热交换组件的。 – 2012-04-19 14:27:12