Prism i Event Aggregator

0

Cześć :)
Próbuję ogarnąć Event Aggregator w Prism, ale coś mi nie idzie.
Poniższy kod piszę z palca, więc przepraszam za ewentualne literówki.

  1. MainWindowViewModel
public class MainWindowViewModel : BindableBase
{
	IEventAggregator _eventAggregator;

	public MainWindowViewModel(IEventAggregator ea)
	{
		_eventAggregator = ea;
		send();
	}	

	private void send()
	{
		_eventAggregator.GetEvent<DataSentEvent>().Publish("STOCK0");
		_ = new SecondWindowView().ShowDialog();
	}
}
  1. SecondWindowViewModel
public class SecondWindowViewModel : BindableBase
{
	public SecondWindowViewModel (IEventAggregator ea)
	{
		ea.GetEvent<DataSentEvent>().Subscribe(Received);
	}	

	void Received(string txt)
	{
		MessageBox.Show(txt);
	}
}
  1. Event
public class DataSentEvent : PubSubEvent<string>{}

I niestety nie działa...
Metoda "Received" w ogóle się nie uruchamia.
Postawiłem na niej breakpoint i debugger go omija - przechodzi do kolejnego breakpointu.

Co zrobiłem źle?

0

Zapewne dlatego, że publikujesz zdarzenie bez wcześniejszej subskrypcji.
Domyślam się, że SecondWindowViewModel tworzysz w SecondWindowView, czyli najpierw publikujesz zdarzenie DataSentEvent, a dopiero potem subskrybujesz.

0

Hmm, ale to zła kolejność? Najpierw chyba powinno się publikować (Publish) - a później subskrybować (Subscribe)?

W pierwszym oknie - MainWindow - publikuję zdarzenie. I z poziomu pierwszego okna otwieram kolejne.
W drugim oknie - SecondWindow - subskrybuję zdarzenie. Czyli odbieram wysłaną wartość.

Może nie do końca rozumiem ideę tego Event Aggregatora, ale jak miałbym to zrobić odwrotnie?

1

Tak zła kolejność. Przykład: newsletter/prenumerata. Te rzeczy są wysyłane co pewien okres czasu. Jeśli chcesz dostawać maila lub czasopismo to subskrybujesz (Subscribe) daną rzecz. Ale te rzeczy (i tylko nowe) dostaniesz dopiero po tym jak dokonasz subskrypcji. Nie dostaniesz maili z newsletter 'a lub czasopisma, które zostały opublikowane(Publish) przed Twoją subskrypcją, prawda? Inny przykład mi nie przyszedł na szybko do głowy :)

0

Ok, w takim razie ponowie pytanie - jak najpierw subskrybować, skoro odbywa się to w nowym oknie, które nie istnieje w momencie publikowania?

Posiłkuję się rozwiązaniem z tej strony: https://prismlibrary.com/docs/event-aggregator.html
Odniosłem wrażenie, że "Subscribing" nie musi być przed "Publishing".
Oczywiście nie upieram się, że nie ma to znaczenia... tylko jak to ustawić? Jeżeli okno nie zostało otwarte, to Event Aggregator i sam Event nie ma chyba prawa wcześniej wiedzieć o istnieniu "odbiorcy"?

0

Tutaj pomogłoby DependencyInjection, więc w przyszłości zainteresuj się tym.
W Twoim przykładzie spróbuj utworzyć SecondViewModel przed publikacją zdarzenia. I tworząc SecondWindowView przekaż ten viewmodel przez parametr.

0

Dzięki, chyba już rozumiem tę kolejność i zależność miedzy Subscribe a Publish :)
Chociaż udało mi się zrobić bez przekazywania SecondViewModel jako parametr do SecondWindowView.
Pomógł w tym ten przykład: https://www.c-sharpcorner.com/UploadFile/5ffb84/prism-event-aggregator-in-wpf-with-mvvm/
A dokładnie to w jaki sposób został tan napisany i wykorzystany Event :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1