2017-04-10 31 views
0

我需要使用MEF和MVVM模式为我的WPF应用程序。MEF automaically解决对象

其实我已经一个ViewModel所以definied:

[Export] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
class MainVM 
{   
    IServiceA serviceA;   
    IServiceB serviceB; 

    [ImportingConstructor] 
    public MainVM(IServiceA serviceA, IServiceB serviceB) 
    { 
     this.serviceA = serviceA; 
     this.serviceB = serviceB; 

     System.Diagnostics.Debug.WriteLine(serviceA.Time); 
    } 
} 

对于VM检索,我利用一个VMLocator的,所以制作:

DataContext="{Binding Source={x:Static provider:ViewModelLocator.Instance}, Path=MainVM}" 

class ViewModelLocator 
{ 
    static ViewModelLocator instance; 

    public MainVM MainVM 
    { 
     get 
     { 
      MainVM output = MefBootstrap.Container.GetExportedValue<MainVM>(); 
      return output; 
     } 
    } 

    protected ViewModelLocator() 
    { 

    } 

    public static ViewModelLocator Instance 
    { 
     get 
     { 
      return instance ?? (instance = new ViewModelLocator()); 
     } 
    } 
} 

从XAML称为

此代码实际工作。

我不知道如果是可实现自动导入VM使用VMLocator的属性声明仅MEF ExportAttribute [导入]而不是使用GetExportValue()方法

的是任何解决方案?

+0

你试过了吗?你做了什么问题? – wkl

+0

MainVM完全没有解决。我试着用 [导入] public MainVM MainVM {get;组; } –

回答

1

它不工作,因为你手动创建ViewModelLocator。既然你创建手动IOC(MEF)没有在这个实例创建控制,因此它不会[Import]依赖(MainVM)从容器到您的property

因此,要解决这个问题:“有没有什么解决办法吗?”:

Here是如何在MVVM方面利用MEF的例子。

我强烈建议你去PRISM。它已经为你完成了。我宁愿不重新发明轮子,特别是这个。

+0

我看看PRISM + MEF的解决方案,老实说,我宁愿保持我的方式,因为这牵涉上引导 –

+0

太多逻辑悉心为您的实际需要更高的“胶水”类,这将创造新的用户控件和MEF的解决方案新的viewmodel,然后将它们粘合在一起。 – Karolis

+0

我结束了使用这个旧的,但很好的解决方案,这也是与MEF兼容。 https://wpftutorial.net/ReferenceArchitecture.html 唯一不好的是,假设一些代码的背后,却也从容器解开。 Hovever它仍然不清楚如何调用他人查看,因为这些不是从App.xml模块调用 –