WPF древовидная структура для использования в качестве меню (стиль MVVM) - PullRequest
1 голос
/ 08 февраля 2010

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

Я знаю, как заполнить древовидную структуру данными (меню) (способ mvvm).

Но: как мне подключить каждый объект в древовидной структуре к ICommand (в Viewmodel) ?? так, например, двойной щелчок объекта приводит к открытию окна ??

Заранее спасибо

1 Ответ

0 голосов
/ 08 февраля 2010

Я думаю, что эту проблему нужно решить по-другому, но ...

  • У вас будет команда на вашем рассматривать модель как собственность.
  • Вы получаете из дерева и древовидный элемент.
  • Вы даете элемент дерева свойство команды, вы связываете это с команда вашей модели представления в дерево представлений itemContainerStyle (в XAML)
  • Вы переопределяете мышь предварительного просмотра вниз на древовидном элементе для вызова команда

вот пример TreeViewItem

   public class EditableTreeViewItem : TreeViewItem {

      public ICommand DoubleClickCommand {
         get { return (ICommand)GetValue(DoubleClickCommandProperty); }
         set { SetValue(DoubleClickCommandProperty, value); }
      }

      // Using a DependencyProperty as the backing store for DoubleClickCommand.  This enables animation, styling, binding, etc...
      public static readonly DependencyProperty DoubleClickCommandProperty =
          DependencyProperty.Register("DoubleClickCommand", typeof(ICommand), typeof(EditableTreeView), new UIPropertyMetadata(null));



      protected override void OnPreviewMouseDoubleClick(MouseButtonEventArgs e) {

         if (this.DoubleClickCommand!= null) {
            this.DoubleClickCommand.Execute(this.DataContext);
            e.Handled = true;
         }
         base.OnPreviewMouseDoubleClick(e);
      }

      protected override DependencyObject GetContainerForItemOverride() {
         return new EditableTreeViewItem();
      }

      protected override bool IsItemItsOwnContainerOverride(object item) {
         return item is EditableTreeViewItem;
      }
}

и дерево для использования этого предмета

 public class EditableTreeView : TreeView {

      //generate the tree view item
      protected override DependencyObject GetContainerForItemOverride() {
         EditableTreeViewItem item = new EditableTreeViewItem();
         return item;
      }

      protected override bool IsItemItsOwnContainerOverride(object item) {
         return item is EditableTreeViewItem;
      }
}

теперь, как уже говорили некоторые умные люди, вам лучше использовать меню и стилизовать его. теперь, когда вы дважды щелкнете по элементу дерева, он будет вызывать команду, а не разворачиваться / сворачиваться, как следует.

это то, как вы будете использовать его в xaml

         <controls:EditableTreeViewMode=OneWayToSource}"
             ItemsSource="{Binding Path=MyItemsSource}">
             <controls:EditableTreeView.ItemContainerStyle>
                <!-- This Style binds a TreeViewItem to a the ViewModel. -->
                <Style
                   TargetType="{x:Type controls:EditableTreeViewItem}">
                   <Setter
                      Property="DoubleClickCommand"
                      Value="{Binding OpenNewWindowCommand}" />
                </Style>
             </controls:EditableTreeView.ItemContainerStyle>
          </controls:EditableTreeView>
...