我已经在buttonclick事件上实现了treeview控件,如下所示:
namespace TaxonomyTreeview
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
ObservableCollection<TaxonomyData> _TaxonomyCollection = new ObservableCollection<TaxonomyData>();
public Window1()
{
InitializeComponent();
}
public ObservableCollection<TaxonomyData> TaxonomyCollection
{ get { return _TaxonomyCollection; } }
private void SelectedTaxonomyChanged(object sender,
RoutedPropertyChangedEventArgs<Object> e)
{
TaxonomyData taxo = taxonomytree.SelectedItem as TaxonomyData;
if (taxo != null)
{
MessageBox.Show("" + taxo.Tid);
}
}
public class TaxonomyData
{
private string _name;
private string _tid;
public string Tid
{
get { return _tid; }
set { _tid = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public TaxonomyData(string name, string tid)
{
Name = name;
Tid = tid;
}
}
private void populate_Click(object sender, RoutedEventArgs e)
{
taxonomytree.Items.Clear();
TaxonomyCollection.Add(new TaxonomyData("Taxonomy1", "1"));
taxonomytree.Items.Add(TaxonomyCollection[0]);
}
}
}
xaml代码是:
<Window x:Class="TaxonomyTreeview.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="435" Width="458" Loaded="Window_Loaded">
<Grid>
<TextBox Height="23" Margin="20,9,0,0" Name="startvid" VerticalAlignment="Top" HorizontalAlignment="Left" Width="120" />
<TextBox Height="23" Margin="165,9,151,0" Name="endvid" VerticalAlignment="Top" />
<Button Height="23.78" HorizontalAlignment="Right" Margin="0,8.22,11,0" Name="populate" VerticalAlignment="Top" Width="115" Click="populate_Click">Populate</Button>
<TreeView HorizontalAlignment="Left" Margin="20,53,0,144" Width="120" Name="taxonomytree" ItemsSource="{Binding Window1.TaxonomyCollection}"
SelectedItemChanged="SelectedTaxonomyChanged">
<TreeView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}" />
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
</Window>
我想显示层次结构中的结构,我想知道将子节点添加到此
的最佳方法是什么请帮忙
的更新:
但这并没有解决问题
如何将子对象分配给“Taxonomy1”,“Tid = 1”
我的问题是在运行时实时在树视图中以分层数据格式显示数据吗?
这是一个解决方案,但最初的问题是将其显示在这样的层次结构中:
词汇1
|
| - Taxonomy1,Tid1
| - Taxonomy2,Tid2
词汇2
|
| - 分类1,Tid3
| - 分类2,Tid4
答案 0 :(得分:4)
您的数据结构不支持父/子关系,因此您的UI也无法支持。
首先要在Children
课程中添加ObservableCollection<TaxonomyData>
类型TaxonomyData
的属性。
要显示这些项目,您需要使用HierarchicalDataTemplate
。这就像普通的DataTemplate
一样,只是它有一个ItemsSource
属性,告诉它在哪里获取项目的子对象。模板本身生成它生成的TreeViewItem
的标题,ItemsSource
告诉它在哪里获取子项:
<HierarchicalDataTemplate DataType="{x:Type TaxonomyData}"
ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
要添加新项目,您可以使Click
事件处理程序看起来像这样:
if (taxonomytree.SelectedItem == null)
{
TaxonomyCollection.Add(new TaxonomyData("foo", "bar");
}
else
{
TaxonomyData td = (TaxonomyData) taxonomytree.SelectedItem;
td.Children.Add(new TaxonomyData("foo", "bar"));
}
这将为孩子添加当前所选项目,如果没有当前选择的项目,则会将其添加到顶级集合。
在任何情况下,您的代码都不应该触及Items
的{{1}}属性,就像您现有的代码一样。 TreeView
由数据绑定填充。管理TreeView
集合,数据绑定将为您处理TaxonomyCollection
项。