2010-04-23 11 views
15

Sto utilizzando mvvm light per creare un'applicazione Silverlight. C'è uno snippet di codice che mostra come accedere alla proprietà o al comando di un modello di vista da un altro modello di vista o dal codice del controllo utente dietro?MVVM light - come accedere alla proprietà nell'altro modello di vista

Immagino sia semplice, ma in qualche modo mi sono perso qualcosa.

Ueli

+0

Dipende dall'implementazione dei controlli. Stai condividendo ViewModel tra le viste che si trovano sotto una vista genitore o stai semplicemente provando a condividere la proprietà/Comando tra due viste indipendenti? –

+0

La vista in questione può essere annidata in diverse viste ma si basa su un viewmodel che deve essere in grado di accedere a una proprietà da un viewmodel indipendente. Nel mio caso concreto si tratta di un CardViewModel che deve acquisire informazioni sull'utente attualmente connesso (gestito e memorizzato in un UserViewModel indipendente) per effettuare una chiamata a un servizio web. –

risposta

34

Si potrebbe utilizzare il Messenger per fare questo: Invia l'utente nella UserViewModel:

Messenger.Send<User>(userInstance); 

sarebbe sufficiente inviare l'utente a chiunque sia interessato.

e registrare un destinatario nella vostra CardViewModel:

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

o si può anche inviare una richiesta dal vostro CardViewModel per gridare l'utente:

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

e reagire in quel nella UserViewModel:

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

(È meglio utilizzare un enum e non una stringa in uno scenario reale:))

Perhabs puoi anche rispondere direttamente ma non riesco a verificarlo al momento.

Basta controllare questo fuori: Mvvm light Messenger

+0

Perfetto, questo è quello di cui avevo bisogno. (e ora sembra così ovvio che mi fa sentire un idiota ...). Danka ond n Gruess noi bandierina del Brasile. –

+0

vostra accoglienza :) e en Gruess USS de chalte Schwiiz zrugg) – CodeWeasel

4

Un altro modo è quello di utilizzare il sovraccarico di RaisePropertyChanged che trasmette anche il cambio. Si potrebbe fare questo:

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

Poi nel abbonato:

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

dove T è il tipo di MyProperty.

Acclamazioni Laurent

0

Un altro modo di guardare al problema è quello di avere un servizio che restituisce la "utente attualmente connesso".

La responsabilità di gestire chi ha effettuato l'accesso è comunque più responsabilità di un servizio e ViewModels rimane semplice.

ViewModels deve esistere solo per la vista. Ma, essendo buoni cittadini, possono anche fornire aiuto ad altri ViewModel come stanno mostrando Laurent e CodeWeasel.

Problemi correlati