我想要一个被选为TreeViewItem
的节点的父节点我有一个包含2个字段的Person类。名称(字符串)和子项(字符串列表)
这是我的xaml代码
<Grid x:Name="gridView" Margin="10">
<TreeView Name="treeView1" TreeViewItem.Selected="TreeViewItem_OnItemSelected" ItemsSource="{Binding}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Source=Check, Mode=TwoWay}" />
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type loc:Person}" ItemsSource="{Binding Children}" >
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</Grid>
这是我背后的代码。 我将项目源设置为Person对象列表。
void set()
{
if (treeView1.Items.IndexOf(treeView1.SelectedItem) != -1)
{
//is a parent
//returns -1 for children
Person selected = (Person)treeView1.SelectedItem;
int index = search(selected);
TreeViewItem parent = treeView1.Tag as TreeViewItem;
setSelected(parent,index);
}
else
{
//is a child
TreeViewItem child = treeView1.Tag as TreeViewItem; //returns the selected node
TreeViewItem parent = child.Parent as TreeViewItem; //returns null
}
}
private void TreeViewItem_OnItemSelected(object sender, RoutedEventArgs e)
{
treeView1.Tag = e.OriginalSource;
int ind = 0;
foreach (var _item in treeView1.Items)
{
if (_item == treeView1.SelectedItem)
{
selectedIndex = ind;
break;
}
ind++;
}
}
在else部分中,child.Parent
始终返回null。我尝试了其他方法,但没有一个返回TreeViewItem
,而是返回DependencyObject
或ItemsControl
。
我也尝试了ContainerFromItem
方法,但它只适用于直接子节点(父节点),而不适用于父节点的子节点。
请帮忙
答案 0 :(得分:1)
您可以使用VisualTreeHelper.GetParent()
方法:
https://msdn.microsoft.com/de-de/library/system.windows.media.visualtreehelper.getparent(v=vs.110).aspx
示例代码:
private TreeViewItem FindParentTreeViewItem(object child)
{
try
{
var parent = VisualTreeHelper.GetParent(child as DependencyObject);
while ((parent as TreeViewItem) == null)
{
parent = VisualTreeHelper.GetParent(parent);
}
return parent as TreeViewItem;
}
catch (Exception e)
{
//could not find a parent of type TreeViewItem
return null;
}
}
需要while循环,因为树视图项的可视父项不是其父树视图项,如在此WPF树可视化器中可见:
答案 1 :(得分:0)
ItemsSource
通常是您可以绑定的DependencyObject
的集合。它没有反映任何有关UI的信息。您正在寻找的实际上是每个项目的ItemContainer,它是WPF UI的一部分。
在大多数情况下,您可以毫无问题地从另一个访问UIElement。但根据我的经验,由于样式,模板和分层项目的UI变得复杂,一些UIElements很难找到。
我建议采用以下方式:
在ViewModel(Person Class)中使用Person类型实现Parent属性,并在Person的构造函数中初始化它,然后您可以像这样获取父Person和父TreeViewItem:
var parentPerson = (treeView1.SelectedItem as Person).Parent;
var parentNode = treeView1.ItemContainerGenerator.ContainerFromItem(parentPerson);