C# 如果数据模板中的文本框获得焦点,则自动选择TreeViewItem(不使用代码)

C# 如果数据模板中的文本框获得焦点,则自动选择TreeViewItem(不使用代码),c#,wpf,xaml,triggers,treeview,C#,Wpf,Xaml,Triggers,Treeview,我有一个两级的树视图。 二级树视图项通过数据模板包含文本框控件 我想要的是:如果TextBox控件获得焦点,则选择相应的TreeViewItem。 我做了一些研究,发现: <Style TargetType="ListViewItem"> <Style.Triggers> <Trigger Property="IsKeyboardFocusWithin" Value="true"> <Setter Property="IsSele

我有一个两级的树视图。 二级树视图项通过数据模板包含文本框控件

我想要的是:如果TextBox控件获得焦点,则选择相应的TreeViewItem。 我做了一些研究,发现:

<Style TargetType="ListViewItem">
<Style.Triggers>
    <Trigger Property="IsKeyboardFocusWithin" Value="true">
        <Setter Property="IsSelected" Value="true" />
    </Trigger>
</Style.Triggers>

如果我用TreeViewItem替换ListViewItem,这几乎可以完美实现

但是:第一个子项总是选择其父项而不是其自身。 (其他子项按预期工作)

所以就像

<TreeView>
<TreeViewItem>
  <TreeViewItem>  <-- this doesn't work
  <TreeViewItem>  <-- this works
</TreeViewItem>
<TreeViewItem>
  <TreeViewItem>  <-- this doesn't work
  <TreeViewItem>  <-- this works
  <TreeViewItem>  <-- this works
</TreeViewItem>
<TreeViewItem>
  <TreeViewItem>  <-- this doesn't work
  <TreeViewItem>  <-- this works
  <TreeViewItem>  <-- this works
</TreeViewItem>
...
</TreeView>


我找到了解决办法。事实证明,这个问题是由应用于1级TreeViewItems的样式引起的(它们只包含一个TextBlock)。因此,如果我将样式更改为

            <Style TargetType="{x:Type TreeViewItem}">
                <Style.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsKeyboardFocusWithin" Value="True"></Condition>
                            <Condition Property="HasItems" Value="False"></Condition>
                        </MultiTrigger.Conditions>
                        <MultiTrigger.Setters>
                            <Setter Property="IsSelected" Value="True"></Setter>
                        </MultiTrigger.Setters>
                    </MultiTrigger>
                </Style.Triggers>
            </Style>

并将此样式设置为
,一切都可以按需工作