Przekazanie parametru z ViewModelu do ViewModelu

0

Apka komunikator. Kiedy klikam w kontaktach Pisz, w Communicator.Contacts/ViewModels/ContactViewModel metoda OpenWriteWindow publikuje event z parametrem którym jest nazwa osoby do której chcemy pisać. Ten event subskrybuje Communicator/Shell/ShellViewModel i otwiera wtedy nowe okno do pisania. W tym oknie jest UserControl z View i ViewModelem (Communicator.Talk/ViewModels/TalkViewModel) do którego muszę przekazać wspomniany parametr z nazwą rozmówcy. Pytanie jak?

Próbowałem dodać subskrybowanie eventu też w tym ViewModelu, ale najpierw odpalany jest event, dopiero po tym ustawia się subskrybowanie eventu. Co więcej, jeśli otworze okno do rozmowy po raz n-ty event też odpali się n-razy i dopiero zasubskrybuje.
Wrzucam całą solucję bo nie ma sensu bujać się z wycinkami kodu.

@DibbyDum wiem że lubisz zagadki w WPF :P Nie wiem kogo tu jeszcze zawołać...

0

Tak sobie patrzę w ten kod i nie mogę dojść co miałeś na myśli z jednej strony przekazywanie IEventAggregator w konstruktorze z drugiej strony w jakieś metodzie wirtualnej jest rejestracja. Do tego wydaje się że IEventAggregator powinien być singleton'em ale nie doszukałem się takiego wpisu do unity. Do tego jakiś cudem nie wiem czemu jest podwójne wywołanie nowego okna przez co dane przesłane przez publish są ignorowane.

Jako że nie miałem styczności z prism itd. to sobie coś pogooglowałem w celu dokształcenia i natrafiłem na tutorial na którym się wzorowałeś http://www.developmentalmadness.com/archive/2010/03/08/mvvm-with-prism-101-ndash-part-6b-wrapping-iclientchannel.aspx a w szczególności na kodzie dołączonym do postów, ale dość wybiórczo(zgadłem? :) ).

Reasumując nie znam się ale się wypowiedziałem i nie mogłem się doszukać konkretnego miejsca żeby wskazać tu jest źle. Ja bym zaczął od początku.

0

Ten tutorial widzę pierwszy raz na oczy :P. Wzorowałem się na serię tych tutoriali obejrzałem kilka miesięcy temu, i teraz robiłem to co jeszcze pamiętam + trochę https://msdn.microsoft.com/en-us/library/gg406140.aspx
EventAggregator jest singieltonem. Pewnie musiałem najpierw dodać go do konstruktora ViewModelu, później jednak do BaseViewModel aby mieć go w każdym i zapominałem usunąć z konstruktora VM.
W każdym razie to nic nie zmienia, tak działa unity. Dodaje jakieś interfejsy do konstruktora i automagicznie dostaje ich implementację lub daje unityConainer.Resolve

Do tego jakiś cudem nie wiem czemu jest podwójne wywołanie nowego okna przez co dane przesłane przez publish są ignorowane.

To nie jest tak. Kiedy otwiera się nowe okno tworzy się view i nowy VM. Kiedy zamkniesz okno i otworzysz nowe, tworzony jest nowy VM a ten stary zalega w pamięci i w nim też odpalany jest event. Ale to już rozwiązałem, używałem zwykłych eventów które ciągle trzymały referencje do VM.
Problemem jest to że odpalam event -> tworzony jest View i VM -> w VM dopiero teraz mogę ustawić subskrybowanie eventu a to jest już trochę za późno.

Nie zacznę od początku, bo nie mam na to czasu, bo mi się nie chce i dlatego, że na mój dzisiejszy stan wiedzy zrobiłbym tak samo. :D
Ten Prism to szajs jest, zamiast po prostu pisać to szukam sposobu jak pisać w "Prism way"

0

Przestań robić takie rzeczy na eventach nie od tego one są
Normalnie otwórz formatkę przekazując w konstruktorze identyfikator lub encję, lub "wstrzyknij" ją w properta

Eventy używaj gdy coś się wydarzyło w programie ale w sumie nie wiadomo gdzie i musiałbyś poszukać wszystkich miejsc w których trzeba dokonać zmiany (relacja jeden do wielu, nie wiele do jednego)

0

Przestań robić takie rzeczy na eventach nie od tego one są

User kliknął w przycisk do otwierania okienka wiadomośći więc otwieram okno, lub przyszła nowa wiadomość wtedy też otwieram okno. Nie do tego służy event? To nie wiem do czego.

Normalnie otwórz formatkę przekazując w konstruktorze identyfikator lub encję, lub "wstrzyknij" ją w properta

Tak zrobiłem, problem rozwiązany. Ale powinien być lepszy sposób. Nie mam za bardzo możliwości dobrania się do konstrukotora lub samego VM, więc trzeba było kombinować.

Eventy używaj gdy coś się wydarzyło w programie ale w sumie nie wiadomo gdzie i musiałbyś poszukać wszystkich miejsc w których trzeba dokonać zmiany (relacja jeden do wielu, nie wiele do jednego)

Nie wiem o czym ty piszesz.

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