繁体   English   中英

属性上的MEF / Prism导出/导入属性

[英]MEF/Prism Export/Import attributes on properties

这是情况

我有2个单例类(实际上是ViewModels)。

[Export]
[PartCreationPolicy(CreationPolicy.Shared)]
public class CompanyViewModel, INavigationAware
{
   private Model.Company _selected;

   [ImportingConstructor]
   public CompanyViewModel(Service.ICompany companyService)
   {
      Companies = companyService.Companies;       
   }

   [Export("SelectedCompany")]
   public Model.Company Selected
   {
      get
      {
         return _selected;
      }
      set
      {
         _selected = value;
      }
   }

   public ObservableCollection<Model.Company> Companies{get;set;}

   public void OnNavigatedTo(NavigationContext navigationContext)
   {
      _selected = Companies.First();
   }
   ~~~
}

companyService返回2个公司“A”和“B”。 当导航到CompanyViewModel类时,“A”被设置为选定的公司。 然后用户选择公司“B”,并通过它的绑定更新CompanyViewModel。

[Export]
[PartCreationPolicy(CreationPolicy.Shared)]    
public class DepartmentViewModel, INavigationAware
{
   [Import("SelectedCompany")]
   private Model.Company _selectedCompany{get;set;};

   [ImportingConstructor]
   public DepartmentViewModel(Service.IDeparment departmentService)
   {
      Departments= departmentService.Departments;
   }

   public ObservableCollection<Model.Department> Departments{get;set;}

   public void OnNavigatedTo(NavigationContext navigationContext)
   {
      this.departmentService.Refresh(_selectedCompany);
   }
   ~~~
}

在上述事件之后,创建了DepartmentViewModel。 问题是DepartmentViewModel中的公司属性被设置为公司“A”而非公司“B”,正如我所预料的那样,因为我认为MEF会导入最后一个值Selected设置为(在创建DepartmentViewModel之前)而不是第一个值它被设定为。

有人能告诉我实际发生了什么吗?

我相信你使用MEF不是因为它的设计。 当您尝试使用它时,MEF不适用于“绑定”。 MEF用于创建合成应用程序。

在您的情况下,问题是MEF在创建CompanyViewModel后不会更新SelectedCompany部件注册。 这就是它总是返回A原因。

使用另一种方法 - 为每个公司创建单独的DepartmentViewModel ,或相应地将其更新为选定的公司。 不要使用MEF - 仅将MEF用作“在启动期间初始化应用程序一次的容器”。

PS。 实际上,我从未在使用属性的Export属性之前看到过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM