Обмен данными между несколькими ViewModels - PullRequest
3 голосов
/ 06 сентября 2011

В дополнение к моему вопросу как я могу связать Bing Pushpins из нескольких моделей?

Это довольно ново для меня, и я искал в Интернете, но кажется, что существует множество подходов к MVVM, а затем добавляются в WP7, и я немного запутался

Сейчас я пытаюсь найти лучший способ обмена данными между ViewModels или даже если это лучший способ сделать это.

Что я имею в виду, например, у меня есть

Мои модели: PeopleModel, BuildingModel Мои ViewModels: PeopleViewModel, BuildingViewModel (которые содержат наблюдаемые коллекции модели)

В настоящее время таймер используется для обновления списков из веб-службы. ViewModel, потому что он статический, может обновляться в течение всего времени жизни приложения. Я не уверен, что это самый разумный подход, но мне нужна некоторая форма фоновой синхронизации, чтобы соответствовать требованиям.

Люди и Здания содержат местоположение, но не имеют ничего общего с тем, какое изображение оно должно отображать в виде кнопки. Поэтому я подумал, что если бы у меня был вид карты, содержащий MapViewModel, который каким-то образом связан с ViewModel, но я не уверен, как бы вы это сделали.

Я посмотрел на MVVMLight, и кажется, что вы можете зарегистрировать ViewModels при запуске, чтобы можно было добавлять ссылки на другие ViewModels и не беспокоиться о времени их жизни?

Однако, учитывая, что в Моделях есть дополнительная информация, в которой Карта не заинтересована, мне интересно, лучше ли иметь автономную MapViewModel, которая содержит списки пользовательских кнопок (типа PeoplePushpins, BuildingPushpins). Если я пойду по этому пути, я хотел бы знать, как вы обновляете MapViewModel из данных, обновленных в других моделях.

Я имею в виду, что таймер запуска в PersonViewModel обнаруживает изменение в списке, поэтому обновляет свой собственный список. Мне нужно отправить уведомление на карту о том, что есть обновление, которое затем само обновится.

Любая помощь / совет, полученный с благодарностью.

1 Ответ

2 голосов
/ 07 сентября 2011

С MVVMLight вы можете использовать обмен сообщениями для передачи данных между моделями:

//build class to send as message  
public class AddPushPinMessage
{
    public PushPin PushPin { get; set; }
}

public class ReceivingViewModel
{
  public ReceivingViewModel()
  {
     Messenger.Default.Register<AddPushPinMessage>(this, (m) => AddPushPin(m));
  }

  void AddPushPin(AddPushPinMessage msg)
  {
     //handle message
  }
}

public class SendingViewModel
{
  private object SendPushPin(PushPin key)
  { 
    Messenger.Default.Send<AddPushPinMessage>(new SetPushPinMessage() { PushPin = key });

    return null;
  }
}
...