在WPF MVVM中使用MEF时导入不起作用

时间:2018-10-22 08:30:37

标签: c# mvvm mef

我想在WPF上测试MEF。 我使用一个项目作为接口:

// Project name MEFWpfTest.Interfaces
public interface IAppViewModel
{
    string Name { get; set; }
}

然后创建一个新项目以实现此接口:

// Project name MEFWpfTest.ViewModels
[Export("AppViewModel")]
public class AppViewModel : IAppViewModel
{
    public string Name { get; set; }
}

在WPF项目App.xaml.cs中,我尝试在MEF中编写零件:

// Project name MEFWpfTest
public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        var aggregateCatalog = new AggregateCatalog();
        Assembly assembly = Assembly.GetExecutingAssembly();
        aggregateCatalog.Catalogs.Add(new AssemblyCatalog(assembly));

        var directoryPath = Path.GetDirectoryName(assembly.Location);

        if (directoryPath != null)
        {
            aggregateCatalog.Catalogs.Add(new DirectoryCatalog(directoryPath, $"MEFWpfTest.*.dll"));

        }

        CompositionContainer Container = new CompositionContainer(aggregateCatalog);
        Container.ComposeParts(this);

        MainWindow w = new MainWindow();
        w.Show();
    }
}

然后在MainWindow.xaml.cs中,我使用IAppViewModel进行导入:

// Project name MEFWpfTest
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    [Import("AppViewModel")]
    public Interfaces.IAppViewModel AppVM { get; set; }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    { // I set a break point here.

    }
}

运行此应用程序时,我发现AppVM为空。当我在一个汇编中执行相同的操作时很好。 MEFWpfTest已经引用了MEFWpfTest.Interfaces和MEFWpfTest.ViewModels。

我做错了什么地方

1 个答案:

答案 0 :(得分:0)

在其构造函数上编写零件:

public MainWindow()
{
    InitializeComponent();
    Container.ComposeParts(this); // get container somehow
}

请注意,导入属性/字段所有者类会自动导入其属性/字段,而无需显式ComposeParts()。如果AppViewModel具有[Import]个属性/字段,则会自动设置它们。您无需在ComposeParts(this)的构造函数中调用AppViewModelComposePart()级联导入类。