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

时间:2012-07-05 15:33:12

标签: c# wpf xaml triggers treeview

我有一个2级TreeView。 Level-2 TreeViewItems通过数据模板包含TextBox控件。

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

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

Link

如果我用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 个答案:

答案 0 :(得分:3)

我找到了解决方案。事实证明,问题是由应用于level-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>

并将此样式设置为<TreeView.ItemContainerStyle>,一切都按预期工作。

相关问题