当前位置:  开发笔记 > 编程语言 > 正文

如何以编程方式选择WPF TreeView中的项目?

如何解决《如何以编程方式选择WPFTreeView中的项目?》经验,为你挑选了5个好方法。

如何以编程方式选择WPF中的项目TreeView?该ItemsControl模型似乎阻止了它.



1> 小智..:

对于那些仍在寻找解决这个问题的人来说,下面就是这个问题.我在DaWanderer 的代码项目文章"WPF TreeView Selection" http://www.codeproject.com/KB/WPF/TreeView_SelectionWPF.aspx的评论中找到了这个.它由Kenrae于2008年11月25日发布.这对我来说非常有用.谢谢Kenrae!

这是他的帖子:

让自己的数据对象具有IsSelected属性(我也建议使用IsExpanded属性),而不是走树.使用TreeView上的ItemContainerStyle属性为TreeViewItems定义样式,该属性将TreeViewItem中的这些属性绑定到数据对象.像这样的东西:





对我不起作用; 程序选择总是自动重置为之前选择的内容,除非之前没有选择任何内容.我已经用示例代码创建了[相关问题](http://stackoverflow.com/questions/13778515/synchronizing-a-selectedpath-property-with-the-selecteditem-in-wpfs-treeview).
效果很好,有一些额外的注释:模型需要实现INotifyPropertyChanged并为IsSelected和IsExpanded属性激活PropertyChangedEvent.此外,如果要扩展项目,还需要扩展其所有祖先,这意味着模型也有一个父关系是有意义的.
这并不总是有效。TreeView.SelectedItem保留旧值,在某些情况下(多选方案),这会导致奇怪的错误。

2> Steven Robbi..:

出于某些奇怪的原因,这是一个真正的痛苦,您必须使用ContainerFromItem来获取容器,然后调用select方法.

//  selectedItemObject is not a TreeViewItem, but an item from the collection that 
//  populated the TreeView.

var tvi = treeView.ItemContainerGenerator.ContainerFromItem(selectedItemObject) 
          as TreeViewItem;

if (tvi != null)
{
    tvi.IsSelected = true;
}

曾经有一篇关于如何在这里做的博客文章,但现在链接已经死了.


它对我不起作用.虽然TreeView.HasItems为true,但ContainerFromItem返回null.我也试过了ContainerFromIndex(0),它也返回了null.
@SlapY这是一个缓存副本:https://web.archive.org/web/20110624120453/http://askernest.com/archive/2008/01/23/how-to-programmatically-change-the-selecteditem-in -a-WPF的treeview.aspx
这仅适用于一个级别且令人困惑。看我的答案。这是真正的交易。

3> Kent Boogaar..:

您需要获取TreeViewItem然后设置IsSelectedtrue.


那么我如何获得TreeViewItem?
您可以使用treeview.ItemContainerGenerator.ContainerFromItem(item)获取treeviewitem,其中item是treeview.items集合内的单个数据绑定对象。

4> Fandi Susant..:

我已成功使用此代码:

public static TreeViewItem FindTviFromObjectRecursive(ItemsControl ic, object o) {
  //Search for the object model in first level children (recursively)
  TreeViewItem tvi = ic.ItemContainerGenerator.ContainerFromItem(o) as TreeViewItem;
  if (tvi != null) return tvi;
  //Loop through user object models
  foreach (object i in ic.Items) {
    //Get the TreeViewItem associated with the iterated object model
    TreeViewItem tvi2 = ic.ItemContainerGenerator.ContainerFromItem(i) as TreeViewItem;
    tvi = FindTviFromObjectRecursive(tvi2, o);
    if (tvi != null) return tvi;
  }
  return null;
}

用法:

var tvi = FindTviFromObjectRecursive(TheTreeView, TheModel);
if (tvi != null) tvi.IsSelected = true;


这应该是公认的答案。此代码还查找并选择了子元素。

5> akjoshi..:

这并不像看起来那么简单,Steven提供的链接在2008年发布了一个解决方案,该解决方案可能仍然有效,但不会处理Virtualized TreeViews.此外,该条的评论中还提到了许多其他问题.没有违法行为,但我也遇到了同样的问题,无法找到完美的解决方案.以下是一些帮助我很多的文章/帖子的链接 -

如何在TreeView中展开项目?- 第三部分:http: //bea.stollnitz.com/blog/?p = 59

以编程方式在TreeView中选择项目:http: //blog.quantumbitdesigns.com/2008/07/22/programmatically-selecting-an-item-in-a-treeview/#respond

TreeView,TreeViewItem和IsSelected:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/7e368b93-f509-4cd6-88e7-561e8d3246ae/


我发现你的第二个链接(quantumbdesigns)是正确的解决方案,因为它允许你从代表性MVVM实例中选择TreeView中的节点.
推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有