在wpf中将集合绑定到treeview

问题描述

我是C#WPF的新手。我正在尝试制作一个演示应用程序,其中它使用treeview显示分层数据。到目前为止,我已经完成了以下工作。

  1. viewmodelBase.cs
public class viewmodelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string property)
    {
        PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(property));
    }
}
  1. Item.cs
public class Item : viewmodelBase
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }
    public ObservableCollection<Item> Children { get; private set; }
    
    public Item() : this("Item") { }
    public Item(string name)
    {
        Children = new ObservableCollection<Item>();
    }
}
  1. MainWindow.xaml
<Window x:Class="TreeViewDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:TreeViewDemo"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDeFinitions>
            <ColumnDeFinition Width="*" />
            <ColumnDeFinition Width="*" />
        </Grid.ColumnDeFinitions>
        <Grid.RowDeFinitions>
            <RowDeFinition Height="*" />
            <RowDeFinition Height="Auto" />
        </Grid.RowDeFinitions>
        <TreeView x:Name="TreeView_Items" Grid.Row="0" Grid.Column="0" ItemsSource="{ Binding }">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{ Binding Path=Children }" DataType="{ x:Type local:Item }">
                    <TextBlock Text="{ Binding Path=Name }" Foreground="Black" Visibility="Visible" />
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
        <TreeView x:Name="TreeView_Items1" Grid.Row="0" Grid.Column="1">
            <TreeViewItem Header="Item">
                <TreeViewItem Header="Item" />
                <TreeViewItem Header="Item" />
            </TreeViewItem>
            <TreeViewItem Header="Item">
                <TreeViewItem Header="Item">
                    <TreeViewItem Header="Item" />
                </TreeViewItem>
                <TreeViewItem Header="Item" />
            </TreeViewItem>
            <TreeViewItem Header="Item" />
        </TreeView>
        <Button x:Name="Button_Add" Grid.Row="1" Grid.Column="0" Content="Add" Click="Button_Add_Click" />
        <Button x:Name="Button_Test" Grid.Row="1" Grid.Column="1" Content="Test" />
    </Grid>
</Window>
  1. MainWindow.xaml.cs
public partial class MainWindow : Window
{
    public ObservableCollection<Item> Items { get; } = new ObservableCollection<Item>();
    public MainWindow()
    {
        InitializeComponent();
        Items.Add(new Item("Parent"));
        TreeView_Items.ItemsSource = Items;
    }
    private void Button_Add_Click(object sender,RoutedEventArgs e)
    {
        var selected = TreeView_Items.SelectedItem as Item;
        if (selected == null)
            Items.Add(new Item("Parent"));
        else
            selected.Children.Add(new Item("Item"));
    }
}

问题是当我编译并运行它时,treeviewitems不会出现在treeview中,并且不会大喊大叫。当我检查实时可视树时,treeview将textblock作为子级而不是treeviewitem。 live visual tree image。 如果我单击添加buttonm,它将仅添加一个textblock而不是treeviewitem。谁能告诉我我在做什么错?

解决方法

这是因为您没有在Item类中设置名称。正在添加项目,但由于名称为空,因此看不到任何内容。

public Item(string name)
{
    Name = name;
    Children = new ObservableCollection<Item>();
}