Reputation: 153
I'm using mvvm light to build a Silverlight application. Is there a code snippet that shows how to access a view model's property or command from within another view model or user control's code behind?
I guess it's simple, but I somehow missed something.
Ueli
Upvotes: 15
Views: 11720
Reputation: 694
Another way to look at the problem is to have a service that returns the "currently logged in user".
The responsibility of handling who's logged in is more the responsibility of a service anyway, and the ViewModels stay simple.
ViewModels should exist only for the View. But, being good citizens, they can also provide help to other ViewModels like Laurent and CodeWeasel are showing.
Upvotes: 0
Reputation: 6662
Another way is to use the overload of RaisePropertyChanged that also broadcasts the change. You would do this:
RaisePropertyChanged(() => MyProperty, oldValue, newValue, true);
Then in the subscriber:
Messenger.Default.Register<PropertyChangedMessage<T>>(this, Handler);
where T is the type of MyProperty.
Cheers Laurent
Upvotes: 4
Reputation: 691
You could use the Messenger to do this: Send the user in the UserViewModel:
Messenger.Send<User>(userInstance);
would just send the user to anyone interested.
And register a recipient in your CardViewModel:
Messenger.Register<User>(this, delegate(User curUser){_curUser = curUser;});
or you can also send a request from your CardViewModel for shouting the user:
Messenger.Send<String, UserViewModel>("Gimme user");
And react on that in the UserViewModel:
Messenger.Register<String>(this, delegate(String msg)
{
if(msg == "Gimme user")
Messenger.Send<User>(userInstance);
});
(You better use an enum and not a string in a real scenario :) )
Perhabs you can even response directly but I can't check it at the moment.
Just check this out: Mvvm light Messenger
Upvotes: 34