【发布时间】:2014-10-29 07:39:20
【问题描述】:
我想要一个被选为 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 方法,但它只适用于直接子(父)而不是父的子。
请帮忙
【问题讨论】:
-
在 WPF UI 中导航有时非常棘手。如果您找不到实现此目的的方法,只需尝试在您的 Person 类中添加一个 Parent ,这会使导航变得更加容易。
标签: c# wpf treeview wpf-controls treeviewitem