【问题标题】:KeyBinding on a TreeViewItemTreeViewItem 上的键绑定
【发布时间】:2010-06-29 16:05:26
【问题描述】:

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

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 上使用命令(因为它是有意义的)。有什么想法吗?

【问题讨论】:

    标签: wpf treeview treeviewitem inputbinding key-bindings


    【解决方案1】:

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

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

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

    注意如何使用子属性语法SelectedItem.RenameItemVM 用作绑定源。

    不幸的是,绑定到TreeView 上的选定项目有点乏味。您不能直接绑定到 SelectedItem(正如您的 XAML 似乎建议的那样),但存在 various methods to overcome this limitation

    一个简单的方法是使用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>
    

    您必须在TreeViewVM 上实现SetSeletectedItemCommand,以设置属性SelectedItem

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 2016-10-09
      • 2014-01-14
      • 2011-10-02
      相关资源
      最近更新 更多