Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Caliburn Micro和MEF的多视图模型_C#_Wpf_Mvvm_Mef_Caliburn.micro - Fatal编程技术网

C# 使用Caliburn Micro和MEF的多视图模型

C# 使用Caliburn Micro和MEF的多视图模型,c#,wpf,mvvm,mef,caliburn.micro,C#,Wpf,Mvvm,Mef,Caliburn.micro,我正在设计一个带有多个ViewModels的WPF应用程序,我正在使用Caliburn Micro和MEF。不幸的是,我是MEF和IoC的新手,无法解决任何问题 应用程序应该有一个MainView,其中有几个选项,例如:创建新记录、编辑旧记录、查看报告等。因此,对于这些单元中的每一个,我都有不同的视图模型类,如CreateRecordViewModel、EditRecordsViewModel、ViewReportsViewModel,以及CreateRecordView等视图的用户控件,Edi

我正在设计一个带有多个ViewModels的WPF应用程序,我正在使用Caliburn Micro和MEF。不幸的是,我是MEF和IoC的新手,无法解决任何问题

应用程序应该有一个MainView,其中有几个选项,例如:创建新记录、编辑旧记录、查看报告等。因此,对于这些单元中的每一个,我都有不同的视图模型类,如CreateRecordViewModel、EditRecordsViewModel、ViewReportsViewModel,以及CreateRecordView等视图的用户控件,EditRecordsView、ViewReportsView等

现在,MainViewModel是一个导体,我使用的代码如下:

public class ShellViewModel : Conductor<object> 
{         
     public void ShowCreateRecord()
     {
          ActivateItem(new CreateRecordViewModel(...Dependencies...));
     }

     public void ShowEditRecords() 
     {
          ActivateItem(new EditRecordsViewModel(...Dependencies...));
     }

     ...
}
由于MEF容器驻留在Bootstrapper中,因此我对如何在这个MainViewModel中使用构造函数注入有点迷茫。我的第二个关注点是GC。如何测试创建的ViewModels是否已正确处置


我知道这些问题可能看起来有点愚蠢,但我真的很想找到一个解决办法。我应该用[Import]来装饰我的属性设置器,而不是使用构造函数注入吗?

我自己对MEF并不熟悉,但大多数DIs都是以类似的方式工作的。 您必须将容器的MEF容器注入视图模型,并使用容器解析适当的视图模型

您不应该自己实例化viewmodels,而是在主vm中,再次通过构造函数或属性注入注入容器解析服务-不太熟悉MEF,然后调用ActivateItem\u DependencyService.Resolve

顺便说一句,主VM本身也应该由容器实例化,因此您显然不需要手动将容器注入主VM

IoC只是信任容器为您解决任何问题,否则,就是容器注册的类型注册错误:

public class ShellViewModel : Conductor<object> 
{
  private readonly IMefDependencyContainer _container;      
  public ShellViewModel(IMefDependencyContainer container) {
    _container = container;   
  }     

  public void ShowCreateRecord()
  {
    ActivateItem(_container.Resolve<CreateRecordViewModel>());
  }
}

替换IMefDependencyContainer并用其名称在MEF中解析。

我知道传统的方法,因为我以前使用过Unity,但MEF的方法有点不同,因为需要使用导出和导入等属性。我很久以前就使用过MEF,这是相同的想法,但不是使用构造函数,声明一些DI属性,例如接口类型不具体的容器,并用这些属性标记它们。一旦您手头有了DI容器,您将在那里找到解析可能也具有DI属性的新实例的方法。