Связь PRISM MEF от viewmodel до viewmodel с помощью Eventaggregator в wpf - PullRequest
0 голосов
/ 30 марта 2012

Я пытаюсь создать приложение WPF с использованием WPF и PRISM.Я также использую MEF и mvvm.Можно ли иметь 2 модели представления, которые могут взаимодействовать друг с другом с помощью агрегатора событий?Например.Опубликовать в viewmodel A и подписаться в Viewmodel B?И если так, как?Я построил программу с несколькими моделями представления, и некоторые из этих моделей представления должны взаимодействовать друг с другом, но каким-то образом, если я опубликую в Viewmodel A, используя Eventaggregator, подписка в viewmodel B никогда не будет признана принадлежащей одному и тому же тегу.обновить мой вид, связанный с viewmodel B.

Ответы [ 5 ]

1 голос
/ 30 марта 2012

Это основные ключевые шаги для определения агрегатора событий

(1) Создание агг события ..

открытый класс YourEvent: CompositePresentationEvent {

}

(2) Publisher vm

eventAggregator.Get (). Publish (object);

(3) Подписка Vm

YourEvent eventobj = eventAggregator.Get ();

    if (subscriptionToken != null)
    {
        eventobj.Unsubscribe(subscriptionToken);
    }

    subscriptionToken = eventobj.Subscribe(YourEventHandler, ThreadOption.UIThread, false, yourfun);
0 голосов
/ 09 декабря 2013

Есть ли у вас экземпляр ViewModel "B" и ViewModel "A"? Публикуете ли вы событие до запуска кода подписки? Они оба публикуют / подписываются на одно и то же событие?

EventAggregator.GetEvent(Of MyEventType).Subscribe(Sub()

                                                   End Sub)
0 голосов
/ 30 марта 2012

EventAggregator всегда один и тот же, вы должны передать его каждой Viewmodel. Prism и MEF могут сделать это за вас:

  1. вы можете загрузить EventAggregator в конструктор, используя Unity of PRISM

  2. вы можете добавить ссылку на EventAggregator с помощью MEF

0 голосов
/ 30 марта 2012

Вы подписываетесь, используя WeakReference (слабая подписка)?Если это так, и на вашего подписчика больше нет ссылок, возможно, он собирает мусор и исчезает, прежде чем опубликовать событие.

0 голосов
/ 30 марта 2012

Единственная возможность состоит в том, что ViewModel "B" не загружен или еще не подписан на событие.Если это не так, я предлагаю вам вставить несколько фрагментов.

...