这是情况
我有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之前)而不是第一个值它被设定为。
有人可以告诉我实际发生了什么吗?
答案 0 :(得分:2)
我相信你使用MEF不是因为它的设计。当您尝试使用它时,MEF不适用于“绑定”。 MEF用于创建组合应用程序。
在您的情况下,问题是MEF在创建SelectedCompany
后不会更新CompanyViewModel
的部件注册。这就是它始终返回A
的原因。
使用其他方法 - 为每个公司创建单独的DepartmentViewModel
,或相应地将其更新为选定的公司。不要使用MEF - 仅将MEF用作“在启动期间初始化应用程序一次的容器”。
PS。实际上,我从未在使用属性的Export
属性之前看到过。