TreeViewItem上的KeyBinding

我有一个典型的树视图和视图模型。 viewmodel有一个可观察的其他视图模型集合,用作树的数据源。
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(以及从ItemVM中的ICommand / RelayCommand移动到TreeViewVM)都很好,则会调用该命令。 但我想在ItemVM上使用命令(因为它是有意义的)。有任何想法吗?     
已邀请:
需要在TreeViewItem上定义键绑定,因为它是具有焦点的元素。问题是你无法使用Style定义键绑定,这是你可能想要在这里做的。 这是一个使用自定义附加属性通过Style将项添加到InputBinding集合的变通方法。因此,您希望使用类似的东西来定义您的Style,您将其分配给TreeView.ItemContainerStyle。     
  但我想在ItemVM上使用命令(因为它是有意义的)。有任何想法吗? 如果
TreeViewVM
通过
SelectedItem
属性跟踪所选项目,则可以在
TreeView
上定义
InputBindings
,并且仍然在
ItemVM
上执行命令:
<TreeView ItemsSource="{Binding Items}">
  <TreeView.InputBindings>
    <KeyBinding Key="F2" Command="{Binding SelectedItem.Rename}"/>
  </TreeView.InputBindings>
</TreeView>
注意如何使用子属性语法
SelectedItem.Rename
来使用
ItemVM
作为绑定的来源。 不幸的是,绑定到
TreeView
上的所选项目有点单调乏味。你不能直接绑定到
SelectedItem
(正如你的XAML似乎暗示的那样)但是存在各种方法来克服这个限制。我喜欢的一个简单方法是使用Blend Interativity:
<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>
你必须在
TreeViewVM
上实施一个
SetSeletectedItemCommand
来设置属性
SelectedItem
。     

要回复问题请先登录注册