获取 TreeView 中所选项目的 TreeViewItem
Posted
技术标签:
【中文标题】获取 TreeView 中所选项目的 TreeViewItem【英文标题】:Getting TreeViewItem for the selected item in a TreeView 【发布时间】:2011-07-10 06:07:44 【问题描述】:我有一个绑定到具有父子关系的数据集的 TreeView。我将如何从 TreeView 中获得选中的 TreeViewItem?请帮我。我的代码如下。
xaml:-
<TreeView Name="tvPersonal" Background="Transparent" ItemsSource="Binding RootNodes" SelectedItemChanged="tvPersonal_SelectedItemChanged">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="Binding rsParentChild">
<TextBlock Text="Binding Name" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
public MainWindow()
InitializeComponent();
DataSet ds = new BL.BLMenu().GetAllMenues(new BOModule Name = Modules.Personnel );
ds.Tables[0].TableName = "Menu";
DataRelation relation = new DataRelation("rsParentChild",
ds.Tables["Menu"].Columns["MenuId"],
ds.Tables["Menu"].Columns["ParentId"]);
relation.Nested = true;
ds.Relations.Add(relation);
BOMenu mnu = new BOMenu();
BOMenu.RootNodes = ds.Tables["Menu"].DefaultView;
BOMenu.RootNodes.RowFilter = "ParentId IS NULL";
this.DataContext = this;
stbiDate.Content = DateTime.Now;
public DataView RootNodes
get return BOMenu.RootNodes;
BOMenu 类:-
public class BOMenu
public string MenuId
get;
set;
public string Name
get;
set;
public string ParentId
get;
set;
public int Priority
get;
set;
public static DataView RootNodes
get;
set;
【问题讨论】:
【参考方案1】:试试
TreeViewItem tvi = myTree.ItemContainerGenerator.ContainerFromItem(SelectedItem) as TreeViewItem;
或通过以下链接。希望这会有所帮助
Data binding to SelectedItem in a WPF Treeview
Get SelectedItem from TreeView?
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/36aca7f7-0b47-488b-8e16-840b86addfa3/
【讨论】:
这不适用于数据源通过HierarchicalDataTemplate
绑定的树。
这种方式拿不到孙子。【参考方案2】:
这适用于数据源通过 HierarchicalDataTemplate 绑定的树
处理 TreeViewItem.Selected
<TreeView Name="mTreeView" TreeViewItem.Selected="TreeViewItem_OnItemSelected" />
并将 TreeViewItem 设置为 Tag。
private void TreeViewItem_OnItemSelected(object sender, RoutedEventArgs e)
mTreeView.Tag = e.OriginalSource;
以后可以检索到
TreeViewItem tvi = mTreeView.Tag as TreeViewItem;
【讨论】:
你怎么能用代码写这个TreeViewItem.Selected="TreeViewItem_OnItemSelected"
?我正在尝试基于 TreeView 建立一个新控件,并希望在内部而不是在我需要 TreeView 的每个地方进行处理。我似乎无法在任何地方找到可以通过 TreeViewItem 命名空间附加的事件...
您可以在控件的构造函数中这样做:AddHandler(TreeViewItem.SelectedEvent, new RoutedEventHandler(TreeViewItem_Selected)); private void TreeViewItem_Selected(object sender, RoutedEventArgs e) _selectedTreeViewItem = e.OriginalSource as TreeViewItem;
【参考方案3】:
我发现的最佳解决方案涉及一个简单的辅助方法,几乎可以用于 TreeView 的任何事件(即 SelectedItemChanged、MouseLeftButtonUp 等)。
TreeViewItem Item = TreeViewHelper.VisualUpwardSearch(e.OriginalSource as DependencyObject);
我正在使用多个层次结构数据模板,这是对我有用的唯一方法。现在,我可以创建一个基于 TreeView 的新控件,并且可以在内部处理涉及所选项目的所有事件。
public static TreeViewItem VisualUpwardSearch(DependencyObject source)
while (source != null && !(source is TreeViewItem)) source = System.Windows.Media.VisualTreeHelper.GetParent(source);
return source as TreeViewItem;
【讨论】:
【参考方案4】:虽然 biju 的答案适用于平面层次结构,但我不得不为 HierarchicalDataTemplates 寻找解决方案。这是对我有用的扩展方法:
public static TreeViewItem ContainerFromItemRecursive(this ItemContainerGenerator root, object item)
var treeViewItem = root.ContainerFromItem(item) as TreeViewItem;
if (treeViewItem != null)
return treeViewItem;
foreach (var subItem in root.Items)
treeViewItem = root.ContainerFromItem(subItem) as TreeViewItem;
var search = treeViewItem?.ItemContainerGenerator.ContainerFromItemRecursive(item);
if (search != null)
return search;
return null;
你可以使用它
TreeViewItem tvi = treeView
.ItemContainerGenerator
.ContainerFromItemRecursive(treeView.SelectedItem);
【讨论】:
看起来这应该可以解决问题! 2012 年我需要这个时你在哪里 :)以上是关于获取 TreeView 中所选项目的 TreeViewItem的主要内容,如果未能解决你的问题,请参考以下文章