2010-02-08 372 views
1

我有一个要求,其中菜单应该作为窗口左侧的树视图来实现。作为菜单使用的WPF treeview(MVVM样式)

我知道如何使用(菜单)数据(mvvm方式)填充树视图。

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

在此先感谢

+3

而不是找出如何使一个TreeView表现得像一个菜单,为什么不使用的菜单,并使用自定义模板来呈现它在一个TreeView般的方式?在WPF中,使用具有所需行为的控件并更改其外观通常比使用具有所需外观的控件更改其行为更容易。 – itowlson 2010-02-08 00:09:04

+0

我同意itowlson – 2010-02-08 01:56:16

+0

+1 itowlson。 如果你想要一个看起来像树视图的菜单,使用一个菜单,并且它的样式为 – Zied 2010-02-08 02:08:25

回答

0

我觉得这个问题应该以另一种方式来解决,但......

  • 你会对你的 视图模型作为属性的命令。
  • 你从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; 
     } 
} 

现在,正如一些聪明的人已经说过,你最好使用菜单和样式。现在,当你双击树形视图项目时,它会调用命令,而不是像它应该那样展开/折叠。

这是你将如何使用它在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> 
+0

......说实话:从来没有想过要这样做!尽管我在其他领域使用过类似的方法!听起来很有趣,我会试一试。非常感谢你打开一个盲人的眼睛! – 2010-02-08 20:25:47