在TreeViewItem上键入
-
01-10-2019 - |
题
我有一个典型的树视图和一个ViewModel。 ViewModel具有可观察到的其他ViewModels的集合,该集合用作树的数据源。
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>
但是,无论我尝试什么,只要它在“层级”层级板上,我的命令就不会被调用。
如果我在treeview.inputbindings中移动键界(以及iCommand / pelyCommand从itemvm到TreeViewVm)都很好,则调用命令。
但是我想在itemVM上使用命令(因为它很有意义)。有任何想法吗?
解决方案
钥匙绑定需要在树视图上定义,因为这是焦点的元素。问题是您无法使用样式定义密钥绑定,这就是您可能想在这里做的。
这里 是使用自定义附件的属性通过样式将项目添加到输入收藏集中的一个解决方法。因此,您需要使用类似的内容来定义您的样式,然后将其分配给TreeView.itemcontainerstyle。
其他提示
但是我想在itemVM上使用命令(因为它很有意义)。有任何想法吗?
如果 TreeViewVM
通过 SelectedItem
您可以定义的属性 InputBindings
在 TreeView
并且仍然在 ItemVM
:
<TreeView ItemsSource="{Binding Items}">
<TreeView.InputBindings>
<KeyBinding Key="F2" Command="{Binding SelectedItem.Rename}"/>
</TreeView.InputBindings>
</TreeView>
注意次级语法如何 SelectedItem.Rename
被用来使用 ItemVM
作为结合的来源。
不幸的是,绑定到A上所选项目有点乏味 TreeView
. 。你不能直接约束 SelectedItem
(正如您的XAML所暗示的那样)但是存在 克服此限制的各种方法.
一种简单的方法是使用 混合互动:
<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>
您将必须实施 SetSeletectedItemCommand
在 TreeViewVM
设置属性 SelectedItem
.
不隶属于 StackOverflow