2010-04-23 12 views
15

Używam światła mvvm do zbudowania aplikacji Silverlight. Czy istnieje fragment kodu pokazujący, jak uzyskać dostęp do właściwości lub polecenia modelu widoku z poziomu innego modelu widoku lub kodu kontrolki użytkownika?Światło MVVM - jak uzyskać dostęp do właściwości w innym widoku modelu

Sądzę, że to proste, ale jakoś coś przeoczyłem.

Ueli

+0

To zależy od implementacji elementów sterujących. Czy udostępniasz ViewModel między widokami, które znajdują się w widoku nadrzędnym, lub po prostu próbujesz udostępnić właściwość/polecenie między dwoma niezależnymi widokami? –

+0

Widok, o którym mowa, może być zagnieżdżony w różnych widokach, ale jest przekazywany na modelu podglądu, który musi mieć dostęp do właściwości z niezależnego modelu widoku. W moim konkretnym przypadku jest to CardViewModel, który potrzebuje pobrać informacje o aktualnie zalogowanym użytkowniku (obsługiwane i przechowywane w niezależnym UserViewModel), aby nawiązać połączenie z serwisem internetowym. –

Odpowiedz

34

Można użyć Messenger, aby to zrobić: Wyślij użytkownikowi w UserViewModel:

Messenger.Send<User>(userInstance); 

po prostu wysłać użytkownikowi wszystkich zainteresowanych.

i zarejestrować odbiorcę w swoim CardViewModel:

Messenger.Register<User>(this, delegate(User curUser){_curUser = curUser;}); 

lub można również wysłać żądanie z CardViewModel dla krzycząc użytkownika:

Messenger.Send<String, UserViewModel>("Gimme user"); 

i reagują na to w UserViewModel:

Messenger.Register<String>(this, delegate(String msg) 
{ 
if(msg == "Gimme user") 
Messenger.Send<User>(userInstance); 
}); 

(Lepiej używać wyliczenia, a nie ciągu w rzeczywistym scenariuszu:))

Perhabs można nawet odpowiedzieć bezpośrednio, ale nie mogę go sprawdzić w tej chwili.

Wystarczy sprawdzić to: Mvvm light Messenger

+0

Idealne, tego właśnie potrzebowałem. (a teraz wydaje się tak oczywiste, że czuję się jak idiota ...). Dzięki ond n Gruess us Brazil. –

+0

Twoje powitanie :) i en gruess uss de chalte schwiiz zrugg;) – CodeWeasel

4

Innym sposobem jest użycie przeciążenie RaisePropertyChanged że również nadającą zmianę. Można by to zrobić:

RaisePropertyChanged(() => MyProperty, oldValue, newValue, true); 

Następnie w subskrybenta:

Messenger.Default.Register<PropertyChangedMessage<T>>(this, Handler); 

gdzie T jest typem myProperty.

Cheers Laurent

0

Innym sposobem, aby spojrzeć na problem jest mieć usługę, która zwraca „aktualnie zalogowanego użytkownika”.

Odpowiedzialność za to, kto jest zalogowany, zależy w większym stopniu od serwisu, a ViewModels pozostaje prosty.

ViewModels powinien istnieć tylko dla widoku. Ale będąc dobrymi obywatelami, mogą również zapewnić pomoc innym ViewModels, takim jak Laurent i CodeWeasel.

Powiązane problemy