单击TreeView项以选择不起作用

时间:2011-03-25 15:29:19

标签: wpf xaml treeview selection

我有一个带有分层数据模板的树

<HierarchicalDataTemplate DataType="{x:Type local:TreeItem}" ItemsSource="{Binding Path=Children}" >
   <TreeViewItem Focusable="True" ToolTip="{Binding ToolTipText}" >
      <TreeViewItem.Header>
         <StackPanel Orientation="Horizontal" Focusable="True" >
            <Image Width="16" Height="16" Margin="3,0">
               <Image.Source>
                  <Binding 
                                Path="IsLeaf" Converter="{StaticResource cnvIsBooleanToStringArrayItemConverter}">
                     <Binding.ConverterParameter>
                        <x:Array Type="sys:String">
                           <sys:String>..\Images\document_plain.png</sys:String>
                           <sys:String>..\Images\folder.png</sys:String>
                        </x:Array>
                     </Binding.ConverterParameter>
                  </Binding>
               </Image.Source>
            </Image>
            <TextBlock MaxWidth="300" Text="{Binding Desc}" Focusable="True" />
         </StackPanel>
      </TreeViewItem.Header>
   </TreeViewItem>
</HierarchicalDataTemplate>

我想通过单击包含“Desc”的TextBlock来选择项目,但选择项目的唯一方法是单击文本左侧的空白区域(图像区域)

有哪些线索缺失?

此致 克劳斯

3 个答案:

答案 0 :(得分:7)

您的数据模板在其根目录指定TreeViewItem,但TreeView将自动在您的模板周围创建一个TreeViewItem,TreeViewItem中的TreeViewItem会混淆选择机制。

做这样的事情:

    <HierarchicalDataTemplate DataType="{x:Type local:TreeItem}" ItemsSource="{Binding Path=Children}">
        <HierarchicalDataTemplate.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
                <Setter Property="ToolTip" Value="{Binding ToolTipText}"/>
                <Setter Property="Focusable" Value="True"/>
                <Setter Property="Header">
                    <Setter.Value>
                        ...
                    </Setter.Value>
                </Setter>
            </Style>
        </HierarchicalDataTemplate.ItemContainerStyle>
    </HierarchicalDataTemplate>

修改 经过一些测试后发现,弄乱容器非常麻烦,我没有让它显示工具提示,除非你找到了办法,我建议你坚持只设置HierarchicalDataTemplate.VisualTree(默认内容) HierarchicalDataTemplate)将放置在自动生成的TreeViewItem的标头中。

答案 1 :(得分:5)

H.B.说,你不应该在你的分层数据模板中放置一个TreeViewItem,因为WPF会自动创建一个TreeViewItem来包装你的内容。

如果要绑定到工具提示,可以在ItemContainerStyle中执行,它将应用于TreeView中所有的树视图项。

<TreeView .... your parameters >
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="ToolTip" Value="{Binding ToolTipText}"/>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

我希望这会有所帮助。

虽然我没有测试过,但我认为您的分层数据模板应如下所示:

    <HierarchicalDataTemplate DataType="{x:Type local:TreeItem}" ItemsSource="{Binding Path=Children}" >
             <StackPanel Orientation="Horizontal">
                <Image Width="16" Height="16" Margin="3,0">
                   <Image.Source>
                      <Binding Path="IsLeaf" Converter="{StaticResource cnvIsBooleanToStringArrayItemConverter}">
                         <Binding.ConverterParameter>
                            <x:Array Type="sys:String">
                               <sys:String>..\Images\document_plain.png</sys:String>
                               <sys:String>..\Images\folder.png</sys:String>
                            </x:Array>
                         </Binding.ConverterParameter>
                      </Binding>
                   </Image.Source>
                </Image>
                <TextBlock MaxWidth="300" Text="{Binding Desc}"/>
             </StackPanel>
    </HierarchicalDataTemplate>

答案 2 :(得分:0)

您可能需要设置背景=&#34;透明&#34;在StackPanel上和/或删除TextBlock上的Focusable设置。