我正在寻求一些帮助,我希望那里有一些好的灵魂能够给我一个提示:)
我正在使用MVVM Light构建一个新的应用程序。在此应用程序中,创建View时,它会使用MEF导入实例化相应的ViewModel。
以下是一些代码:
public partial class ContractEditorView : Window
{
public ContractEditorView ()
{
InitializeComponent();
CompositionInitializer.SatisfyImports(this);
}
[Import(ViewModelTypes.ContractEditorViewModel)]
public object ViewModel
{
set
{
DataContext = value;
}
}
}
这是ViewModel的导出:
[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(ViewModelTypes.ContractEditorViewModel)]
public class ContractEditorViewModel: ViewModelBase
{
public ContractEditorViewModel()
{
_contract = new Models.Contract();
}
}
现在,如果我想打开一个新窗口以创建一个新合同,这是有效的......或者换句话说,如果我不需要传递现有合同的ID,它就是完美的。
但是,假设我想使用相同的View来编辑现有合同。在这种情况下,我会将新构造函数添加到同一个View中,该View接受模型ID或模型对象。
“不幸的是”ViewModel始终以相同的方式创建:
[Import(ViewModelTypes.ContractEditorViewModel)]
public object ViewModel
{
set
{
DataContext = value;
}
}
据我所知,这会在合成时调用相应ViewModel的标准/无参数构造函数。
所以我想知道的是如何区分这种行为?如何在合成时调用特定的构造函数?或者如何在导入期间传递一些参数?
如果这个问题听起来很愚蠢,我真的很抱歉,但我最近才开始使用MEF!
提前致谢,
干杯, 詹卢卡。
答案 0 :(得分:0)
你可以这样做。查看MVVM-Light中的 Messenger 实现。您可以传递 NotificationMessage(Of Integer)以将正确的ID发送到视图模型。视图模型必须注册该类型的消息,并在发送消息时加载它。
MEF Imports默认只有一个无参数构造函数。