Нажатие элемента TreeView, чтобы выбрать не работает - PullRequest
4 голосов
/ 25 марта 2011

У меня есть дерево с шаблоном иерархических данных

<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», но единственный способ выбрать элемент - щелкнуть в поле слева от текста (область изображения)

Какие-нибудь подсказки, чего не хватает?

С уважением Клаус

Ответы [ 3 ]

7 голосов
/ 25 марта 2011

В вашем шаблоне данных указывается 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>

Edit: После некоторого тестирования выясняется, что возиться с контейнером довольно хлопотно, я не заставлял его отображать всплывающую подсказку таким образом, если вы не нашли способ сделать это, я рекомендую придерживаться только установки HierarchicalDataTemplate.VisualTree (содержимое по умолчанию для HierarchicalDataTemplate ), который будет помещен в заголовок автоматически сгенерированного TreeViewItem.

5 голосов
/ 25 марта 2011

Как говорит HB, вам не следует помещать TreeViewItem в ваш шаблон иерархических данных, поскольку WPF автоматически создаст его для переноса вашего содержимого.

Если вы хотите привязать подсказку, вы можете сделать это внутри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>
0 голосов
/ 25 марта 2011

Вам может потребоваться установить Background = "Transparent" в StackPanel и / или удалить настройку Focusable в TextBlock.

...