【发布时间】:2014-07-21 07:14:44
【问题描述】:
我的树视图看起来像这样
<TreeView x:Name="ArticlesTreeView" Grid.Column="0" AllowDrop="True">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type structure:NewsPaperDocument}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" Tag="{Binding Object}" FontWeight="Bold" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type structure:NewsPaperPage}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" Tag="{Binding Object}" Foreground="#00a300" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type structure:NewsPaperTitle}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" Tag="{Binding Object}" Foreground="#da532c" />
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type structure:NewsPaperBlock}">
<TextBlock Text="{Binding Name}" Tag="{Binding Object}" Foreground="#2b5797" />
</DataTemplate>
</TreeView.Resources>
</TreeView>
在ArticlesTreeView.SelectedItem 中存储类NewsPaperDocument, NewsPaperPage, etc 的实例。如何获得与SelectedItem 关联的TreeViewItem?我尝试使用VisualTreeHelper.GetParent(elem);,但SelectedItem 没有DependencyObject 类型
UPD1 添加简单示例,演示问题。 item 在ArticlesTreeView_SelectedItemChanged 中总是null
XAML
<Window x:Class="TestTree.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:testTree="clr-namespace:TestTree"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TreeView x:Name="ArticlesTreeView" Grid.Column="0" AllowDrop="True" SelectedItemChanged="ArticlesTreeView_SelectedItemChanged">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type testTree:A}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" FontWeight="Bold" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type testTree:B}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" Foreground="#00a300" />
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type testTree:C}">
<TextBlock Text="{Binding Name}" Foreground="#2b5797" />
</DataTemplate>
</TreeView.Resources>
</TreeView>
</Grid>
CS
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
namespace TestTree
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var a = new A
{
Name = "a",
Children = new List<B>
{
new B
{
Name = "b1",
Children = new List<C>
{
new C{Name = "c1"},
new C{Name = "c2"},
new C{Name = "c3"}
},
},
new B
{
Name = "b2",
Children = new List<C>
{
new C{Name = "c1"},
new C{Name = "c2"},
new C{Name = "c3"}
},
},
new B
{
Name = "b3",
Children = new List<C>
{
new C{Name = "c1"},
new C{Name = "c2"},
new C{Name = "c3"}
},
}
}
};
ArticlesTreeView.ItemsSource = new List<A> { a };
}
private void ArticlesTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
ItemContainerGenerator gen = ArticlesTreeView.ItemContainerGenerator;
var item = gen.ContainerFromItem(ArticlesTreeView.SelectedItem);
}
}
internal class A
{
public string Name { set; get; }
public List<B> Children { set; get; }
}
internal class B
{
public string Name { set; get; }
public List<C> Children { set; get; }
}
internal class C
{
public string Name { set; get; }
}
}
【问题讨论】:
-
ArticlesTreeView.SelectedItem是TreeViewItem。你的问题是得到TreeView?我不确定我是否理解您的问题 -
@YuvalItzchakov 如果你通过手动添加
TreeViewItem's 来创建你的树,那么它就可以了。但我使用HierarchicalDataTemplate,我的树会从集合中自动创建。SelectedItem和SelectedValue的类型是NewsPaperBlock或 etc
标签: c# wpf treeview treeviewitem visualtreehelper