问题描述
我是C#WPF的新手。我正在尝试制作一个演示应用程序,其中它使用treeview显示分层数据。到目前为止,我已经完成了以下工作。
- viewmodelBase.cs
public class viewmodelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string property)
{
PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(property));
}
}
- 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>();
}
}
- 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>
- 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>();
}