MVVM light – как получить доступ к свойству в другой модели представления

Я использую mvvm light для создания приложения Silverlight. Есть ли фрагмент кода, показывающий, как получить доступ к свойству или команде модели представления из кода другой модели представления или пользовательского элемента управления?

Вроде все просто, но я что-то упустил.

Ули


person Ueli Sonderegger    schedule 23.04.2010    source источник
comment
Это зависит от реализации ваших элементов управления. Вы делитесь ViewModel между представлениями, которые находятся под родительским представлением, или вы просто пытаетесь поделиться свойством/командой между двумя независимыми представлениями?   -  person Jeff Wain    schedule 23.04.2010
comment
Рассматриваемое представление может быть вложено в разные представления, но оно зависит от модели представления, которая должна иметь доступ к свойству из независимой модели представления. В моем конкретном случае это CardViewModel, которому необходимо получить информацию о вошедшем в данный момент пользователе (обрабатывается и хранится в независимой модели UserViewModel), чтобы выполнить вызов веб-службы.   -  person Ueli Sonderegger    schedule 23.04.2010


Ответы (3)


Вы можете использовать Messenger для этого: Отправьте пользователя в UserViewModel:

Messenger.Send<User>(userInstance);

просто отправит пользователя всем, кто заинтересован.

И зарегистрируйте получателя в своей CardViewModel:

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

или вы также можете отправить запрос из вашей CardViewModel для крика пользователю:

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

И отреагируйте на это в UserViewModel:

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

(В реальном сценарии вам лучше использовать перечисление, а не строку:))

Возможно, вы даже можете ответить напрямую, но я не могу проверить это в данный момент.

Просто проверьте это: Mvvm light Мессенджер

person CodeWeasel    schedule 23.04.2010
comment
Отлично, это то, что мне было нужно. (и теперь это кажется настолько очевидным, что я чувствую себя идиотом...). Dankä ond n Gruess us Brasilie. - person Ueli Sonderegger; 24.04.2010

Другой способ — использовать перегрузку RaisePropertyChanged, которая также передает изменение. Вы бы сделали это:

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

Затем в подписчике:

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

где T — тип MyProperty.

Ура Лоран

person LBugnion    schedule 31.05.2013

Другой способ взглянуть на проблему — иметь службу, которая возвращает «пользователя, вошедшего в систему в данный момент».

Ответственность за обработку тех, кто вошел в систему, в любом случае больше лежит на службе, и ViewModels остаются простыми.

ViewModels должны существовать только для представления. Но, будучи добропорядочными гражданами, они также могут оказывать помощь другим моделям ViewModel, таким как показывают Laurent и CodeWeasel.

person Patrice Calvé    schedule 22.01.2014