只有在选中时才展开TreeViewItem,按下展开箭头时不会展开

编程语言 2026-07-08

我正在尝试这样设置:当用户选择一个 TreeViewItem 时,就会展开。然而,问题在于如果用户选择展开器来折叠该项,它也会被视为已被选中。

我该如何让它仅在头部被选中时才展开该项?

以下是代码:

XAML:

<TreeView ItemsSource="{Binding TreeViewItems}">
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" 
                    Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" 
                    Value="{Binding IsSelected, Mode=TwoWay}" />
        </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Header}"/>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

代码:

public bool IsExpanded
{
    get => _isExpanded;
    set
    {
        if (_isExpanded == value)
            return;
        _isExpanded = value;

        OnPropertyChanged();
    }
}
public bool IsSelected
{
    get => _isSelected;
    set
    {
        if (_isSelected == value)
            return;
        _isSelected = value;

        if (_isSelected)
        {
            IsExpanded = true;
        }

        OnPropertyChanged();
    }
}

解决方案

你应该重写 TreeViewItem 的模板并设置 Focusable="False"。不让展开器元素获得焦点应该就能解决你的问题。

另外,如果你正在使用自定义/扩展的 TreeViewItem,你可以在 OnApplyTemplate 的覆盖中搜索模板中的 ToggleButten,并在处理程序中设置 Focusable

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章