Treeview是否使用命令绑定进行展开/折叠?

时间:2011-01-19 04:25:45

标签: wpf treeview keyboard-shortcuts commandbinding

WPF Treeview响应 + - 击键以展开和折叠树中的节点。太好了!

是否存在现有命令我可以将工具栏按钮或菜单项绑定到树视图中执行相同的操作?我没有看到与stock命令常量中的扩展/折叠有关的任何内容。

1 个答案:

答案 0 :(得分:5)

TreeView通过将TreeViewItem绑定到ToggleButton.IsChecked中的TreeViewItem.IsExpanded来处理ControlTemplate的扩展,并使用键盘处理扩展覆盖TreeViewItem.OnKeyDown。所以,不,它在实现中不使用命令。

但是你可以毫不费力地添加自己的命令。在此示例中,我向TreeView添加了一个行为,以便它响应标准的OpenClose应用程序命令:

<DockPanel>
    <Menu DockPanel.Dock="Top">
        <MenuItem Header="Open" CommandTarget="{Binding ElementName=treeView1}" Command="Open"/>
        <MenuItem Header="Close" CommandTarget="{Binding ElementName=treeView1}" Command="Close"/>
    </Menu>
    <TreeView>
        <i:Interaction.Behaviors>
            <local:TreeViewCommandsBehavior/>
        </i:Interaction.Behaviors>
        <TreeViewItem Header="Root">
            <TreeViewItem Header="Item1">
                <TreeViewItem Header="Subitem1"/>
                <TreeViewItem Header="Subitem2"/>
            </TreeViewItem>
            <TreeViewItem Header="Item2">
                <TreeViewItem Header="Subitem3"/>
                <TreeViewItem Header="Subitem4"/>
            </TreeViewItem>
        </TreeViewItem>
    </TreeView>
</DockPanel>

以下是使其发挥作用的行为:

public class TreeViewCommandsBehavior : Behavior<TreeView>
{
    private TreeViewItem selectedTreeViewItem;

    protected override void OnAttached()
    {
        AssociatedObject.AddHandler(TreeViewItem.SelectedEvent, new RoutedEventHandler(TreeViewItem_Selected));
        AssociatedObject.CommandBindings.Add(new CommandBinding(ApplicationCommands.Open, CommandExecuted));
        AssociatedObject.CommandBindings.Add(new CommandBinding(ApplicationCommands.Close, CommandExecuted));
    }

    private void TreeViewItem_Selected(object sender, RoutedEventArgs e)
    {
        selectedTreeViewItem = e.OriginalSource as TreeViewItem;
    }

    private void CommandExecuted(object sender, ExecutedRoutedEventArgs e)
    {
        bool expand = e.Command == ApplicationCommands.Open;
        if (selectedTreeViewItem != null)
            selectedTreeViewItem.IsExpanded = expand;
    }
}

如果您不熟悉行为,请先添加此命名空间:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

并为项目添加相应的引用。