2016-12-25 18 views
1

私は2つのビューモデルを持つWPFで自分のコードを書いています。 1つのビューモデルでは、私は、プリズムにポップアップウィンドウを閉じていますし、近くに私のような私の出版メソッドを呼び出しています:Prism - 公開されたイベントが購読されていない

public ResidentListViewModel(IResidentService residentService, IUserService userService, IEventAggregator eventAggregator) 
{ 
    var res = eventAggregator.GetEvent<PubSubEvent>().Subscribe(InitializeCollectionView); 
    _residentService = residentService; 
    _userService = userService; 
    _eventAggregator = eventAggregator; 
    InitializeCollectionView(); 

    //***The InteractionRequest class 
    FormDialogOpenRequest = new InteractionRequest<INotification>(); 
    ConfirmationRequest = new InteractionRequest<IConfirmation>(); 

     //*** Commands for each of the buttons 
    RaiseFormDialogOpenCommand = new DelegateCommand<object>(this.RaiseFormDialogOpen); 
    aiseConfirmationCommand = new DelegateCommand<object>(this.RaiseConfirmation); 
} 

ここではどのように両方です:私のイベントをサブスクライブは、このように書きながら

private void OnCancelInteraction() 
{ 
    _eventAggregator.GetEvent<PubSubEvent>().Publish(); 
    this.FinishInteraction(); 
} 

これらのクラスのイベントアグリゲータを受けている。ここで

UnityContainer container = new UnityContainer(); 
var aggregator = container.Resolve<EventAggregator>(); 
this.DataContext = new ResidentFormDialogViewModel(residentService, userService, unitService, aggregator); 

は私の第二のクラスです:

UnityContainer container = new UnityContainer(); 
var aggregator = container.Resolve<EventAggregator>(); 
DataContext = new ResidentListViewModel(residentService, userService, aggregator); 

私のインタラクションをキャンセルするたびに、公開は公開されますが、ResidentListViewModelはサブスクライブとして呼び出されていません。

ResidentListViewModelは、subscribeメソッドを持つ他のクラスの前に呼び出されています。それは問題ではありますか?私が望むのは、MVVMパターンを破ることなくインタラクションが終了するたびにコレクションビューを初期化することだけです。それ以外の方法があればお勧めします。

答えて

1

_eventAggregatorオブジェクトをSingletonに設定し、両方のビューモデルでこの単一インスタンスを使用するようにしてください。あなたの場合の問題は、EventAggregatorオブジェクトがイベントのパブリッシュとサブスクライブに使用されていることと関連している可能性があります。

+0

@NaveedZahoor UnityContainerがEventAggregatorの2つのインスタンスを各クラスに与えているのが分かります。 eventAggregatorをシングルトンとして構成する必要があります。たとえば、 –

+0

を使用すると、次のようになります。container.RegisterType (new ContainerControlledLifetimeManager());また、静的メソッドを使用してEventAggregatorのシングルトンインスタンスを提供するクラスを使用することもできます。 –

+0

はい、あなたは正しいです。ありがとう –

関連する問題