在WPF、C#中向TreeView控件添加子节点

4
我已经在按钮单击事件中实现了一个树形视图控件,代码如下:

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

|

| - Taxonomy 1,Tid3

| - Taxonomy 2,Tid4


您是否希望向TaxonomyCollection中的TaxonomyData元素添加子节点? - Ed Gonzalez
是的,我做。更具体地说,populate_Click按钮单击事件将使用元素值“Taxonomy1”和“1”填充树形视图。我想在树形视图中添加一个子元素。 - user305021
1个回答

4
你的数据结构不支持父/子关系,因此你的用户界面也无法支持。
首先要做的是在你的TaxonomyData类中添加一个类型为ObservableCollection的Children属性。
为了显示这些项目,你需要使用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"));
}

这将会为当前选定的项目添加一个子项,如果没有当前选定的项目,则将其添加到顶级集合。

在任何情况下,您的代码都不应该触及TreeViewItems属性,就像您现在的代码所做的那样。 TreeView是通过数据绑定进行填充的。管理TaxonomyCollection集合,数据绑定将为您处理TreeView的项目。


你能告诉我如何修改我的数据结构以支持父子关系吗?如果需要的话,还请指导如何相应地更改代码。 - user305021
你不理解我的回答的哪一部分?我确定它并不完全清晰。你遇到了什么问题? - Robert Rossney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接