如何在视图中参数化导入?

时间:2010-06-07 11:38:10

标签: mef mvvm-light

我正在寻求一些帮助,我希望那里有一些好的灵魂能够给我一个提示:)

我正在使用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!

提前致谢,

干杯, 詹卢卡。

1 个答案:

答案 0 :(得分:0)

你可以这样做。查看MVVM-Light中的 Messenger 实现。您可以传递 NotificationMessage(Of Integer)以将正确的ID发送到视图模型。视图模型必须注册该类型的消息,并在发送消息时加载它。

MEF Imports默认只有一个无参数构造函数。