在wpf,c#中将子节点添加到树视图控件

时间:2010-03-30 11:10:43

标签: c# wpf treeview

我已经在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

1 个答案:

答案 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项。