Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf TreeViewItem上的键绑定_Wpf_Treeview_Treeviewitem_Inputbinding_Key Bindings - Fatal编程技术网

Wpf TreeViewItem上的键绑定

Wpf TreeViewItem上的键绑定,wpf,treeview,treeviewitem,inputbinding,key-bindings,Wpf,Treeview,Treeviewitem,Inputbinding,Key Bindings,我有一个典型的树视图和视图模型。viewmodel具有其他viewmodel的可观察集合,这些viewmodel用作树的数据源 public class TreeViewVM { public ObservableCollection<ItemVM> Items { get; private set; } public ItemVM SelectedItem { get; set; } } 公共类TreeViewVM{ 公共可观测集合项{get;private se

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

public class TreeViewVM {
    public ObservableCollection<ItemVM> Items { get; private set; }
    public ItemVM SelectedItem { get; set; }
}
公共类TreeViewVM{
公共可观测集合项{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; }
}
public类ItemVM{
公共字符串名称{get;set;}
公共图像源图像{get;private set;}
公共可观测集合子项{get;private set;}
公共ICommand重命名{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>

但是,只要命令位于HierarchycalDataTemplate的“内部”,无论我尝试什么,都不会调用该命令

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


但是我希望在ItemVM上使用该命令(因为它是有意义的)。有什么想法吗?

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

是一种使用自定义附加属性通过样式将项添加到InputBinding集合的变通方法。因此,您可能希望使用类似的方法来定义您的样式,并将其指定给TreeView.ItemContainerStyle

但是我希望在ItemVM上使用该命令(因为它是有意义的)。有什么想法吗

如果
TreeViewVM
通过
SelectedItem
属性跟踪所选项目,则可以在
TreeView
上定义
InputBindings
,并且仍然在
ItemVM
上执行命令:

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

您必须在
TreeViewVM
上实现一个
setselecteditem命令
,设置属性
SelectedItem

,这对我来说非常有效。谢谢你指出SelectedItem.Rename@MartinLiversage,请看我的问题
<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>