如果元素来自 ItemSource,如何在 WPF 树视图中聚焦元素
本文关键字:元素 WPF 视图 聚焦 ItemSource 如果 | 更新日期: 2023-09-27 17:55:09
我也可以解释这个问题,并问我如何在TreeView.Items
中从模型对象中获得TreeViewItem
?
我按照本教程进行操作,而不是TreeViewItems
在TreeView.Items
集合中,而是拥有该模型类的对象。
但是,我需要根据其他一些事件来关注某些TreeView
元素。如果TreeView.Items
包含TreeViewItems
我很容易找到所需的方法并使用其Focus()
方法。但是由于我现在使用绑定,我不知道该怎么做。
当然,我可以通过添加对象以编程方式填充TreeView
TreeViewItems
但是我试图避免它,并遵循更 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);
}
然后对树视图项目执行任何操作:)