8

我有一个典型的树视图和一个视图模型。视图模型有一个可观察的其他视图模型集合,用作树的数据源。

public class TreeViewVM {
    public ObservableCollection<ItemVM> Items { get; private set; }
    public ItemVM SelectedItem { get; set; }
}

和 ItemVM :

public class ItemVM {
    public string Name { get; set; }
    public ImageSource Image { get; private set; }
    public ObservableCollection<ItemVM> Children { get; private set; }
    public ICommand Rename { get; private set; }
}

风景 :

<TreeView Selecteditem="{Binding SelectedItem}" ItemsSource="{Binding Items}">
    <TreeView.ItemTemplate>
         <HierarchicalDataTemplate>
             <StackPanel Orientation="Horizontal">
                 <StackPanel.InputBindings>
                     <KeyBinding Key="F2" Command="{Binding Rename}"/>
                 </StackPanel.InputBindings>
                 <Image Source="{Binding Image}"/>
                 <TextBlock Text="{Binding Name}"/>
         </HierarchicalDataTemplate>
      </TreeView.ItemTemplate>
  </TreeView>

但是,无论我尝试什么,只要它在 HierarchicalDataTemplate“内部”,就不会调用我的命令。

如果我将 TreeView.InputBindings 中的 KeyBinding(以及 ICommand / RelayCommand 从 ItemVM 移动到 TreeViewVM)一切都很好,则调用该命令。

但我想在 ItemVM 上使用命令(因为它是有意义的)。有任何想法吗?

4

2 回答 2

8

但我想在 ItemVM 上使用命令(因为它是有意义的)。有任何想法吗?

如果通过您可以定义的属性跟踪TreeViewVM所选项目,并且仍然在 上实现命令:SelectedItemInputBindingsTreeViewItemVM

<TreeView ItemsSource="{Binding Items}">
  <TreeView.InputBindings>
    <KeyBinding Key="F2" Command="{Binding SelectedItem.Rename}"/>
  </TreeView.InputBindings>
</TreeView>

请注意如何使用子属性语法SelectedItem.Rename将 用作ItemVM绑定的源。

不幸的是,绑定到TreeView. 您不能直接绑定到SelectedItem(正如您的 XAML 似乎暗示的那样),但存在各种克服此限制的方法

一种简单的方法是使用Blend Interactivity

<TreeView Name="treeView" ItemsSource="{Binding Items}">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectedItemChanged">
      <i:InvokeCommandAction Command="{Binding SetSelectedItemCommand}" CommandParameter="{Binding SelectedItem, ElementName=treeView}" />
    </i:EventTrigger>
  </i:Interaction.Triggers>
</TreeView>

您将必须实现一个设置属性的SetSeletectedItemCommandon 。TreeViewVMSelectedItem

于 2013-01-23T13:16:34.683 回答
6

键绑定需要在 TreeViewItem 上定义,因为它是具有焦点的元素。问题是您不能使用样式定义键绑定,这可能是您在这里想要做的。

是一种解决方法,它使用自定义附加属性通过 Style 将项目添加到 InputBinding 集合。所以你想使用类似的东西来定义你的 Style,你会分配给 TreeView.ItemContainerStyle。

于 2011-03-08T23:28:00.767 回答