2013-08-06 10 views
6

Czy ktoś może być tak uprzejmy, aby wyjaśnić dla mnie komunikat MVVM Light? Czytałem post na StackOverflow tutaj: MVVM pass values between view models próbuje to uzyskać. Dokumentacja dotycząca MVVM Light nie jest w tym momencie świetna, więc nie jestem całkowicie pewien, dokąd się udać.Używanie komunikatora MVVM Light do przesyłania wartości między modelami widoku

Powiedz, że mam dwa ViewModels i ViewModelLocator. Chcę móc przekazywać parametry między wszystkimi trzema bez problemu. Jak mam to zrobić z posłańcem? Czy to jest w stanie?

Edytuj: Oto moja nowa implementacja. Jak na razie wygląda na to, że MessengerInstance nie wymaga tokena. Jestem strasznie zdezorientowany.

W pierwszym ViewModel:

MessengerInstance.Send<XDocument>(SelectedDocument); 

aw drugim:

MessengerInstance.Register<XDocument>(this, xdoc => CopySettings(xdoc)); 

Może być całkowicie błędne. Nie miałem okazji go przetestować, ale studio wizualne robi się mniej na mnie zła, kiedy robię to w ten sposób. Również MessengerInstance rejestruje się przed wysłaniem wiadomości.

+0

„ale visual studio dostaje mniej zły mnie, kiedy robię to w ten sposób ". Ha. To mnie rozśmieszyło. :) –

Odpowiedz

12

Powiedz, że mam dwa ViewModels i ViewModelLocator. Chcę móc przekazywać parametry między wszystkimi trzema bez problemu. Jak mam to zrobić z posłańcem? Czy to jest w stanie?

To jest dokładnie to, do czego służy, tak.

Aby wysłać wiadomość:

MessengerInstance.Send(payload, token); 

Aby otrzymać wiadomość:

MessengerInstance.Register<PayloadType>(
    this, token, payload => SomeAction(payload)); 

Istnieje wiele przeciążeń, więc nie wiedząc dokładnie, co chcesz osiągnąć poprzez posłańca, wygrałem "Przejdź do wszystkich z nich, ale powyższe powinno obejmować prosty przypadek, w którym chcesz wysłać i odebrać wiadomość z ładunkiem.

Należy zauważyć, że "token" może być wszystkim, co identyfikuje wiadomość. Podczas gdy ciąg jest często używany do tego, wolę używać enum bo to trochę bezpieczniejsze i umożliwia intellisense „znajdź zwyczaje”, itp

Na przykład:

public enum MessengerToken 
{ 
    BrushChanged, 
    WidthChanged, 
    HeightChanged 
} 

Wtedy twój wysyłać/odbierać byłoby coś takiego:

// sending view model 
MessengerInstance.Send(Brushes.Red, MessengerToken.BrushChanged); 

// receiving view model 

// put this line in the constructor 
MessengerInstance.Register<Brush>(this, token, brush => ChangeColor(brush)); 

public void ChangeColor(Brush brush) 
{ 
    Brush = brush; 
} 

[EDIT] URL do komentarza devuxer jest poniżej zmienione na: http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/

+0

To jest idealne! Próbowałem szukać dokumentacji, ale nie znalazłem żadnego. Czy znasz jakąkolwiek dokumentację, której może mi brakować? Nie widziałem prawie żadnego dla MVVM Light. – DanteTheEgregore

+0

Facet, który opracował MVVM Light, Laurent Bugnion, używa swojego bloga do wprowadzania nowych funkcji lub aktualizacji funkcji. Oto szczególny wpis na komunikatorze, który może Ci się przydać: http://blog.galasoft.ch/lbugnion/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta.aspx – devuxer

+0

Byłem na chirurgii i nie miałem szansy, aby rozpocząć wdrażanie tego do dziś. Nie widzę, gdzie MessengerInstance wymaga tokena. Dodam moją implementację do głównego postu. Zadałem też inne pytanie: http://stackoverflow.com/questions/18241290/mvvm-light-messenger-not-functioning-as-expected/18241995?noredirect=1#18241995 – DanteTheEgregore

Powiązane problemy