简体   繁体   English

带有ItemsSource右键的TreeViewItem不会选择Item

[英]TreeViewItem with ItemsSource Right-Click doesn't select the Item

<DataTemplate DataType="{x:Type EntityType:FixedDevice}">
    <TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource NameConverter}}"/>
</DataTemplate>

<TreeView.ItemContainerStyle>
    <Style TargetType="TreeViewItem">
        <EventSetter Event="PreviewMouseRightButtonUp" Handler="TreeViewItem_RightClick"/>
    </Style>
</TreeView.ItemContainerStyle>
<TreeViewItem Header="Data Warehouse">
    <TreeViewItem.Items>
        <TreeViewItem Header="Platforms">
            <TreeViewItem.Items>
                <TreeViewItem>
                    <TreeViewItem.Header>
                        <TextBlock Text="{Binding RelativeSource={RelativeSource Self},
                                   Path=Parent.Items.Count,
                                   StringFormat=Public ({0})}">
                        </TextBlock>
                    </TreeViewItem.Header>
                </TreeViewItem.Header>
            </TreeViewItem.Items>
        </TreeViewItem>
    </TreeViewItem.Items>
</TreeViewItem>

 private void TreeViewItem_RightClick(object sender, MouseButtonEventArgs e) {
      TreeViewItem item = sender as TreeViewItem;
      if(item != null) { item.Focus(); item.IsSelected = true; }
      e.Handled = true;
 }

How come when I right-click, it only selects the top-most node? 右键单击时,为什么只选择最顶部的节点呢? and not the one I click? 而不是我点击的那个? Similar for an ItemsSource , which the Item itself is not a TreeViewItem , but a DataTemplate with a TextBlock , how do I select the object in the TreeView visually? 对于类似ItemsSource ,其Item本身并不是一个TreeViewItem ,但DataTemplate有一个TextBlock ,我怎么在TreeView直观地选择对象?

Edit, see below for answer based on @Viv answer. 编辑,有关基于@Viv答案的答案,请参见下文。 I ended up having to use e.OriginalSource to retrieve the TextBlock then the TreeViewItem that the Item was in. 我最终不得不使用e.OriginalSource来检索TextBlock然后检索该Item所在的TreeViewItem

private void TreeViewItem_RightClick(object sender, MouseButtonEventArgs e) {
    TreeViewItem item = (e.OriginalSource as FrameworkElement).Parent as TreeViewItem;
    if(item == null) {
        item = e.Source as TreeViewItem;
        if(item == null) {
            return;
        }
    }
    item.IsSelected = true;
    e.Handled = true;
}

It's because what your looking for is e.Source and not sender 这是因为您要查找的是e.Source而不是sender

try switching your right-click handler to: 尝试将右键单击处理程序切换为:

private void TreeViewItem_RightClick(object sender, MouseButtonEventArgs e) {
  TreeViewItem item = e.Source as TreeViewItem;
  if (item == null)
    return;
  // item.Focus();
  item.IsSelected = true;
  e.Handled = true;
}

Sample Download 样本下载

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM