Как передать выбранный элемент Treeview другой команде? - PullRequest
0 голосов
/ 18 августа 2011

Я создал древовидное представление в WPF MVVM с иерархическим свойством DAtaTemplate.

За пределами Treeview у меня есть кнопка «РЕДАКТИРОВАТЬ». При нажатии кнопки редактирования я хочу передать выбранный элемент Treeview в RelayCommand в модели представления.

Я реализую ту же функциональность внутри TreeviewItem при двойном щелчке узла. Однако я хочу знать, каков наилучший способ сделать это снаружи.

Моя структура кода выглядит следующим образом

MainView -> MainViewModel

StateViewItem -> StateViewModel (HierarchicalDataTemplate, наследующий от TreeViewItemViewModel)

RegionViewItem -> RegionViewModel (DataTemplate наследуется от TreeViewItemViewModel)

RegionViewModel обрабатывает двойной щелчок для узла и выполняет функцию редактирования.

Однако кнопка «РЕДАКТИРОВАТЬ» находится за пределами древовидного списка. Как передать выбранный RegionViewItem в командную границу, чтобы я мог загрузить его для редактирования?

Заранее спасибо за помощь

Ответы [ 2 ]

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

Код ниже только для целей руководства для MVVM.Может компилироваться или не компилироваться.

Способ 1:

Предполагая, что TreeViewItemViewModel является контекстом данных модели представления уровня базового элемента для всех элементов представления дерева в вашем дереве, добавьте свойство с возможностью записив TreeViewItemViewModel называется IsSelected.Не забывайте уведомлять об изменениях свойств в IsSelected в Setter.

В вашем дереве просмотра XAML добавьте следующее в Style, предназначенное для TreeViewItem ....

  <TreeView.Resources>
      <Style TargetType="{x:Type TreeViewItem}">
          <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
      </Style> 
  </TreeView.Resources>

Таким образом, когда выбран любой TreeView, ТОЛЬКО его собственное свойство TreeViewItemViewModel IsSelected будет иметь значение true, а все остальные элементы представления дерева будут иметь значение false.Таким образом, оставшейся задачей было бы найти выбранный TreeViewItemViewModel объект из иерархии объектов, связанных с ItemsSource из TreeView.

Способ 2:

Иметь присоединенное свойстводля TreeViewItem и обработать его событие MouseDown.Проверьте, является ли значение IsSelected объекта TreeViewItem истинным и извлеките его контекст данных, который будет выбранным TreeViewItemViewModel.

  <TreeView.Resources>
      <Style TargetType="{x:Type TreeViewItem}">
          <Setter Property="local:MyAttachedBehavior.HandleMouseDown" Value="true" />
      </Style> 
  </TreeView.Resources>

в статическом методе изменения свойства зависимости HandleMouseDownPropertyChanged (), обработайте событие MouseDownна (TreeViewItem)sender ...

  ((TreeViewItem)sender).MouseDown += TreeViewMouseDownEventHandler;

  private static TreeViewMouseDownEventHandler(object sender, MouseButtonEventArgs e)
  {
      var treeViewItem = (TreeViewItem)sender;
      if (treeViewItem.IsSelected)
      {
            var mySelectedItem = treeViewItem.DataContext as TreeViewItemViewModel; 
      } 
  }

Передайте этот выбранный экземпляр TreeViewItemViewModel в качестве необходимого выбранного элемента в вашу процедуру.

Дайте мне знать, если это поможет.

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

Имеет ли RegionViewModel доступ к StateViewModel? Или, что еще важнее, до StateViewModel.SelectedItem? (Некоторый код будет полезен)

Если нет, вам, возможно, придется внедрить систему событий, в которой при изменении StateViewModel.SelectedItem она передает событие StateChanged, а RegionViewModel подписывается на это событие и отслеживает SelectedState

...