0

これが状況です

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は、「A」と「B」の2つの会社で戻ります。「A」は、CompanyViewModelクラスに移動したときに選択された会社として設定されます。次に、ユーザーは会社「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の会社のプロパティが、予想どおり会社「B」ではなく会社「A」に設定されていることです。これは、MEFが最初の値ではなく(DepartmentViewModelの作成前に)最後の値をインポートすると思ったためです。に設定されました。

誰かが実際に何が起こっているのか教えてもらえますか?

4

1 に答える 1

2

設計どおりではなく、MEFを使用していると思います。MEFは、使用しようとする「バインディング」用ではありません。MEFは、コンポジションアプリケーションを作成するためのものです。

SelectedCompanyあなたの場合、問題は、MEFがの作成後に部品登録を更新しないことですCompanyViewModel。これがA常に戻る理由です。

別のアプローチを使用DepartmentViewModelします。会社ごとに個別に作成するか、選択した会社に応じて更新します。そのためにMEFを使用しないでください。MEFは「アプリケーションの起動時に一度アプリケーションを初期化するコンテナー」としてのみ使用してください。

PS。Export実際、プロパティの属性の使用法はこれまで見たことがありません。

于 2012-09-12T08:26:01.010 に答える