如果元素来自 ItemSource,如何在 WPF 树视图中聚焦元素

本文关键字:元素 WPF 视图 聚焦 ItemSource 如果 | 更新日期: 2023-09-27 17:55:09

我也可以解释这个问题,并问我如何在TreeView.Items中从模型对象中获得TreeViewItem

我按照本教程进行操作,而不是TreeViewItemsTreeView.Items集合中,而是拥有该模型类的对象。

但是,我需要根据其他一些事件来关注某些TreeView元素。如果TreeView.Items包含TreeViewItems我很容易找到所需的方法并使用其Focus()方法。但是由于我现在使用绑定,我不知道该怎么做。

当然,我可以通过添加对象以编程方式填充TreeView TreeViewItems但是我试图避免它,并遵循更 WPF 的绑定方式。

如果元素来自 ItemSource,如何在 WPF 树视图中聚焦元素

TreeViewItem tvItem = (TreeViewItem)treeView
                          .ItemContainerGenerator
                          .ContainerFromItem(item);
tvItem.Focus();
  <Style TargetType="TreeViewItem" BasedOn="{StaticResource {x:Type TreeViewItem}}">
    <Setter Property="IsSelected" Value="{Binding IsSelectedInEditor, Mode=TwoWay}" />
  </Style>

这是我对 TreeViewItem 的样式,其中我将 IsSelected 属性绑定到模型对象的 IsSelectedInEditor 属性。也许这不是最好的方法,但我发现它比其他解决方案更容易,而且开箱即用。因此,在此设置之后,您只需要在 TreeView.Items 中找到您的对象,并将其 IsSelectedInEditor(或您选择的任何名称)属性设置为 true。

您可能

希望使用ItemContainerGenerator.ContainerFromItem

在这里找到一个帖子 : http://bea.stollnitz.com/blog/?p=7

还有一个关于如何使用它的一个小示例:

XAML

<TreeView x:Name="tv" ItemsSource="{Binding MyDataList}" SelectedItemChanged="tv_SelectedItemChanged">
    <TreeView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding BusinessProperty}"/>
        </DataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

代码隐藏:

private void tv_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    var tvItem = tv.ItemContainerGenerator.ContainerFromItem(((TreeView)sender).SelectedItem);
}

然后对树视图项目执行任何操作:)