2014-11-02 2 views
0

Должны ли ViewModels быть связанными с другими ViewModels и взаимодействовать с ними или им разрешено только взаимодействовать с моделями? Или смесь обоих?ViewModel и изменения модели и наблюдения

Я постараюсь быть более явным с кодом:

Является ли этот код ОК?

public class MainViewModel 
{ 
    public MainViewModel(IPeopleService service) 
    { 
     var people = service.GetPeople(); 
     People = new ObservableCollection<PersonViewModel>(people.Select(p => new PersonViewModel(p))); 
    } 

    public ObservableCollection<PersonViewModel> People { get; set; } 
    public PersonViewModel SelectedPerson { get; set; } 
} 

Вы видите, что SelectedPerson является ViewModel, а не моделью.

ответ

0

ViewModel может взаимодействовать с другими режимами просмотра, но не так, как вы. В вашем scenerio MainViewModel зависит от PersonViewModel. Это неправильный подход, и это должна быть модель Person.

Если вы хотите взаимодействовать с ViewModels и передавать данные между ними, вы должны использовать шаблон медиатора. Многие популярные MVVM-фреймворки обладают этой возможностью, и это называется службой Messenger.

Редактировать: Вот пример кода. Обычно я использую MVVM Light, но вы можете использовать все, что хотите.

public class MainViewModel 
{ 
    public MainViewModel(IPeopleService service) 
    { 
     var people = service.GetPeople(); 
     People = new ObservableCollection<Person>(people.Select(p => new Person(p))); 
    } 

    public ObservableCollection<Person> People { get; set; } 

    private Person _person; 
    public Person SelectedPerson 
    { 
     get 
     { 
      return _person; 
     } 
     set 
     { 
      if(value != null) 
      { 
       _person = value; 
       OnPropertyChanged("SelectedPerson"); 
       //Send selected person on each change 
       Messenger.Default.Send<Person>(_person); 
      } 
     } 
    } 
} 

В ваших PersonViewModel, вы должны зарегистрировать для сообщений типа Person:

public class PersonViewModel 
{ 
    private Person _person; 
    public Person SelectedPerson 
    { 
     get 
     { 
      return _person; 
     } 
     set 
     { 
      if (value != null) 
      { 
       _person = value; 
       OnPropertyChanged("SelectedPerson");      
      } 
     } 
    } 
    public PersonViewModel() 
    { 
     Messenger.Default.Register<Person>(this, (p) => 
      { 
       SelectedPerson = p; 
      }); 
    } 
} 
+0

ОК, но они (авторы MVVM LIBS/рамок) также говорят, что это легко злоупотреблять этот механизм, так Я стараюсь избегать этого. Однако, я думаю, вы правы. Это может быть намного лучше, если вы так сильно не затягиваете ViewModels. Но как это изменить код, который я опубликовал в качестве примера? Что я должен изменить, чтобы сделать это правильно? – SuperJMN

+1

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

Смежные вопросы