Wpf TreeViewItem上的键绑定
我有一个典型的树视图和视图模型。viewmodel具有其他viewmodel的可观察集合,这些viewmodel用作树的数据源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
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>