2010-04-23 17 views
15

Estoy usando mvvm light para crear una aplicación Silverlight. ¿Hay algún fragmento de código que muestre cómo acceder a la propiedad o comando de un modelo de vista desde otro modelo de vista o detrás del código de control de usuario?MVVM light - cómo acceder a la propiedad en otra vista modelo

Supongo que es simple, pero de alguna manera me perdí algo.

Ueli

+0

Depende de la implementación de sus controles. ¿Estás compartiendo ViewModel entre las vistas que están bajo una vista principal o simplemente estás tratando de compartir la propiedad/Comando entre dos vistas independientes? –

+0

La vista en cuestión se puede anidar en diferentes vistas pero se retransmite en un modelo de vista que necesita poder acceder a una propiedad desde un modelo de vista independiente. En mi caso concreto, es un CardViewModel que necesita obtener una información sobre el usuario actualmente conectado (manejado y almacenado en un UserViewModel independiente) para realizar una llamada a un servicio web. –

Respuesta

34

podría utilizar el Messenger para hacer esto: enviar al usuario en el UserViewModel:

Messenger.Send<User>(userInstance); 

sería simplemente enviar al usuario a cualquier persona interesada.

y registrar un destinatario en su CardViewModel:

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

o también puede enviar una solicitud de su CardViewModel por gritar al usuario:

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

y reaccionan en que en el UserViewModel:

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

(Mejor utilizar una enumeración y no una cadena en un escenario real:))

Perhabs incluso puede responder directamente, pero no puedo verificarlo en este momento.

Sólo mira esto: Mvvm light Messenger

+0

Perfecto, eso es lo que necesitaba. (y ahora parece tan obvio que me hace sentir como un idiota ...). DANKA ond n Gruess bandera de Brasil nos. –

+0

Su bienvenida :) y en Gruess USS de chalte Schwiiz Zrugg) – CodeWeasel

4

Otra forma es utilizar la sobrecarga de RaisePropertyChanged que también transmite el cambio. Usted podría hacer esto:

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

Luego, en el suscriptor:

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

donde T es el tipo de MyProperty.

Saludos Laurent

0

Otra manera de mirar el problema es tener un servicio que devuelve el "usuario actualmente conectado".

La responsabilidad de manejar quién ha iniciado sesión es más responsabilidad de un servicio de todos modos, y los ViewModels son simples.

ViewModels debe existir solo para la Vista. Pero, al ser buenos ciudadanos, también pueden brindar ayuda a otros modelos de vista como Laurent y CodeWeasel.

Cuestiones relacionadas