用作菜单的WPF树视图(MVVM样式)

用作菜单的WPF树视图(MVVM样式),wpf,data-binding,mvvm,treeview,Wpf,Data Binding,Mvvm,Treeview,我有一个要求,菜单应该实现为窗口左侧的树状视图 我知道如何用(菜单)数据(mvvm方式)填充treeview 但是:如何将树视图中的每个对象连接到ICommand(在Viewmodel中)??例如,双击一个对象会打开一个窗口 提前谢谢我认为这个问题应该用另一种方式解决,但是 你会把命令放在你的电脑上 将模型视为属性 你从treeview和 树视图项目 你给treeview项目一个 命令属性,您可以将其绑定到 中视图模型的命令 树视图itemContainerStyle(在 (xaml) 您可以

我有一个要求,菜单应该实现为窗口左侧的树状视图

我知道如何用(菜单)数据(mvvm方式)填充treeview

但是:如何将树视图中的每个对象连接到ICommand(在Viewmodel中)??例如,双击一个对象会打开一个窗口


提前谢谢

我认为这个问题应该用另一种方式解决,但是

  • 你会把命令放在你的电脑上 将模型视为属性
  • 你从treeview和 树视图项目
  • 你给treeview项目一个 命令属性,您可以将其绑定到 中视图模型的命令 树视图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;
      }
}
正如上面一些聪明人所说的,你最好使用菜单并设计它的样式。现在,当您双击treeview项时,它将调用该命令,而不是像它应该的那样展开/折叠

这就是在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>

与其弄清楚如何使treeview表现得像菜单,不如使用菜单,并使用自定义模板以类似treeview的方式呈现它?在WPF中,使用具有所需行为的控件并更改其外观通常比使用具有所需外观的控件并更改其行为更容易。如果你想要一个看起来像树状视图的菜单,使用一个菜单并设置它的样式…老实说:从来没有想过这样做!!虽然我在其他领域也使用过类似的方法!听起来很有趣,我来试试。非常感谢你打开一个盲人的眼睛!