Использует ли Treeview привязки команд для раскрытия / свертывания? - PullRequest
6 голосов
/ 19 января 2011

WPF Treeview реагирует на нажатия клавиш + и - , чтобы развернуть и свернуть узлы в дереве.Отлично!

Существует ли существующая команда, к которой я могу привязать кнопки панели инструментов или элементы меню, чтобы выполнить те же действия в древовидной структуре?Я не вижу ничего, связанного с расширением / коллапсом, в константах стоковой команды.

1 Ответ

5 голосов
/ 19 января 2011

TreeView обрабатывает расширение TreeViewItem с помощью мыши, связывая ToggleButton.IsChecked с TreeViewItem.IsExpanded в ControlTemplate и обрабатывает расширение с помощью клавиатуры в переопределении TreeViewItem.OnKeyDown.Так что нет, он не использует команды в своей реализации.

Но вы можете добавлять свои собственные команды без особых усилий.В этом примере я добавил поведение к TreeView, чтобы оно отвечало стандартным прикладным командам Open и Close:

<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"

и добавьте соответствующую ссылку на ваш проект.

...