C# 如果元素来自ItemSource,如何在WPF树视图中聚焦元素?
我还可以解释这个问题,并询问如何从C# 如果元素来自ItemSource,如何在WPF树视图中聚焦元素?,c#,.net,wpf,binding,C#,.net,Wpf,Binding,我还可以解释这个问题,并询问如何从TreeView.Items中的模型对象中获取treevieItem 我遵循TreeView.Items集合中的treevieItems,而不是treevieItems,我拥有该模型类的对象 但是,我需要根据一些其他事件关注某些TreeView元素。如果TreeView.Items包含TreeViewItems我很容易找到一个需要的项目,并使用它的Focus()方法。但由于我现在使用绑定,我不知道如何做到这一点 当然,我可以通过添加TreeViewItems对象
TreeView.Items
中的模型对象中获取treevieItem
我遵循TreeView.Items
集合中的treevieItems
,而不是treevieItems
,我拥有该模型类的对象
但是,我需要根据一些其他事件关注某些TreeView
元素。如果TreeView.Items
包含TreeViewItems
我很容易找到一个需要的项目,并使用它的Focus()
方法。但由于我现在使用绑定,我不知道如何做到这一点
当然,我可以通过添加
TreeViewItems
对象以编程方式填充TreeView
,但是我试图避免它,并采用更WPF的方式进行绑定。您可能希望使用ItemContainerGenerator.ContainerFromItem
TreeViewItem tvItem = (TreeViewItem)treeView
.ItemContainerGenerator
.ContainerFromItem(item);
tvItem.Focus();
请在此处找到帖子:
还有一个关于如何使用它的小示例:
XAML
代码隐藏:
private void tv_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
var tvItem = tv.ItemContainerGenerator.ContainerFromItem(((TreeView)sender).SelectedItem);
}
private void tv\u SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
var tvItem=tv.ItemContainerGenerator.ContainerFromItem(((TreeView)sender)。选择EdItem);
}
然后对您的treeview项目执行任何您想要的操作:)
这是我对TreeViewItem的风格,我将IsSelected属性绑定到模型对象的IsSelectedEditor属性。也许这不是最好的方法,但我发现它比其他解决方案更容易,而且它是现成的。因此,完成此设置后,您只需在TreeView.Items中找到您的对象,并将其IsSelectedEditor(或您选择的任何名称)属性设置为true。谢谢!您必须将其强制转换为TreeViewItem的唯一一件事是要知道,在virtulization的情况下,容器可能为空。这控制“选择”,但不控制“焦点”。焦点没有可绑定属性。如果您在树中单击,然后以编程方式选择另一个具有此绑定的项,则您单击的项周围仍有一个浅边框,表明它仍然处于焦点状态。@SimonF我现在无法检查代码的有效性,但它可能在'11'中起作用,但在几次wpf更新之后,现在可能不起作用。
private void tv_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
var tvItem = tv.ItemContainerGenerator.ContainerFromItem(((TreeView)sender).SelectedItem);
}
<Style TargetType="TreeViewItem" BasedOn="{StaticResource {x:Type TreeViewItem}}">
<Setter Property="IsSelected" Value="{Binding IsSelectedInEditor, Mode=TwoWay}" />
</Style>