Передача свойства из одного представления в модель представления другого представления в MVVM - PullRequest
2 голосов
/ 08 августа 2011

Я новичок в MVVM и имею небольшую проблему. У меня есть два пользовательских элемента управления: родительский и дочерний (с view, viewmodel, модель классов). И нужно передать некоторые свойства от родителя к ребенку. Пока я справился с этим, написав такой код:

public static readonly DependencyProperty CallbackActionProperty =
                DependencyProperty.Register("CallbackAction", typeof (Action), 
        typeof (ChildView), new PropertyMetadata(default(Action)));

public Action CallbackAction
{
  get { return (Action) GetValue(CallbackActionProperty); }
  set
  {
    SetValue(CallbackActionProperty, value);
    ((ChildViewModel)this.DataContext).CallbackAction = value; // Change ViewModel property too
  }
}

Это свойство зависимости в ChildView, и для его набора я также установил свойство ViewModel. После этого я получаю доступ к этому свойству зависимости из ParentView и устанавливаю CallbackAction ->, который устанавливает CallbackAction в дочерней ViewModel.
Код:

  this.Loaded += (sender, args) => childUc.CallbackAction = ((ParentViewModel) this.DataContext).RefreshStatuses;

childUc - это пользовательский контроль, расположенный на родительском элементе и представленный ChildView. Код ужасен, поэтому я надеюсь увидеть лучшую практику с точки зрения того, чтобы не нарушать шаблон. Спасибо.

Ответы [ 2 ]

3 голосов
/ 08 августа 2011

Да - этот код довольно уродливый.На самом деле я изо всех сил пытаюсь выяснить, что именно он делает!

Один из основных арендаторов шаблона MVVM заключается в том, что ViewModel должен быть модульно тестируемым, и его можно выполнить без представления.Столкнувшись с такой проблемой, подумайте только о представлении Model и проигнорируйте его.

У вашего ParentViewModel есть ссылка на ChildViewModel, вы можете сделать это двусторонним отношением, если ParentViewModel предоставит ссылку насам при создании ChildViewModel.Это означает, что из ChildViewModel вы можете выполнить любой открытый метод в ParentViewModel.

Имея это в виду, вы сможете решить свою проблему!

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

1 голос
/ 08 августа 2011

Не пишите никакой логики в сеттере или геттере DependencyProperty, потому что она вызывается платформой другими способами, а не напрямую через методы доступа set / get. Это обязательное правило.

Также строка

((ChildViewModel)this.DataContext).CallbackAction = value; 

введено связанное соединение между текущим View и базовым типом ViewModel, это не принцип MVVM.

В случае зависимости View вы должны рассмотреть возможность передачи свойств с использованием привязок в XAML, в противном случае ParentViewModel должен внедрить ChildViewModel через конструктор. Таким образом, они должны быть разработаны, чтобы указать, что у ParentViewModel есть дочерний объект ...

...