C# 如何将treeview与来自对象的数据绑定(WPF XAML)

C# 如何将treeview与来自对象的数据绑定(WPF XAML),c#,wpf,data-binding,treeview,C#,Wpf,Data Binding,Treeview,我正试图用我列表中的数据在WPF中创建treeview,但我无法这样做 public class Student { public string Department { get; set; } public string studentname { get; set; } public string code { get; set; } } List<Student> Students = new List<Student>(); 我希望在T

我正试图用我列表中的数据在WPF中创建treeview,但我无法这样做

public class Student
{
    public string Department { get; set; }
    public string studentname { get; set; }
    public string code { get; set; }
}

List<Student> Students = new List<Student>();
我希望在Treeview中可以这样表示:

+ A
  John 1
  Rocky 4
  Donald 6
+ B
  Tonny 2
+ C
  Jai 3
  Mickey 5

树视图是分层的,根据您的对象,您需要以不同的方式查看可视化树,您的左栏学生重复系,最好是查看系有学生在树上获得所需的输出。这不是实现这一点的最佳或唯一方法,但它展示了构建所需的结构

创建一个新的WPF项目

在MainWindow.xaml中

    <Window x:Class="WpfTestTreeView.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:WpfTestTreeView"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TreeView x:Name="tvDepts">
            <TreeView.Resources>
                <!-- Top level template -->
                <HierarchicalDataTemplate DataType="{x:Type local:Department}" ItemsSource="{Binding Students}">
                    <TextBlock Text="{Binding Name}" />
                </HierarchicalDataTemplate>
                <!-- Child node template -->
                <DataTemplate DataType="{x:Type local:Student}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="Name: " FontWeight="Bold" />
                        <TextBlock Text="{Binding StudentName}" />
                        <TextBlock Text=" Code: " FontWeight="Bold" />
                        <TextBlock Text="{Binding Code}" />
                    </StackPanel>
                </DataTemplate>
            </TreeView.Resources>
        </TreeView>
    </Grid>
</Window>

在MainWindow.xaml.cs中

using System.Collections.ObjectModel;
using System.Windows;

namespace WpfTestTreeView
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        private ObservableCollection<Department> _departments;

        public MainWindow()
        {
            InitializeComponent();

            // This is a long winded way but it shows the mechanics of the collections 

            _departments = new ObservableCollection<Department>();
            //Create New Depaertment and Student objects
            Department d1 = new Department("A");
            Student s1 = new Student("John","1");
            // Add the Student to the Department Student List
            d1.Students.Add(s1);
            Student s2 = new Student("Rocky", "4");
            // Add the Student to the Department Student List
            d1.Students.Add(s2);
            Student s3 = new Student("Donald", "6");
            // Add the Student to the Department Student List
            d1.Students.Add(s3);
            // Add the Department to The Departments List
            Departments.Add(d1);

            Department d2 = new Department("B");
            Student s4 = new Student("Tony", "2");
            d2.Students.Add(s4);
            Departments.Add(d2);

            Department d3 = new Department("C");
            Student s5 = new Student("Jai", "3");
            d3.Students.Add(s5);
            Student s6 = new Student("Mickey", "5");
            d3.Students.Add(s6);
            Departments.Add(d3);

            // set itemsource on the treeview
            tvDepts.DataContext = Departments;
            tvDepts.ItemsSource = Departments;

        }

        public ObservableCollection<Department> Departments
        {
            get { return _departments; }
            set { _departments = value; }
        }
    }

    // Department Class Holds a Collection of Students
    public class Department
    {

        private ObservableCollection<Student> _students;

        public Department(string name)
        {
            _students = new ObservableCollection<Student>();

            Name = name;
        }

        public string Name { get; set; }
        /// <summary>
        /// Collection Of Student in the Department
        /// </summary>
        public ObservableCollection<Student> Students
        {
            get { return _students; }
            set { _students = value; }
        }
    }
// Student Class
    public class Student
    {
        public Student(string name, string code)
        {
            StudentName = name;
            Code = code;
        }
        public string StudentName { get; set; }
        public string Code { get; set; }
    }
}
使用System.Collections.ObjectModel;
使用System.Windows;
命名空间WpfTestTreeView
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
私人收集部门;
公共主窗口()
{
初始化组件();
//这是一个冗长的方式,但它显示了收集的机制
_部门=新的可观察集合();
//创建新的Depaertment和Student对象
部门d1=新部门(“A”);
学生s1=新生(“约翰”,“1”);
//将该学生添加到系学生列表
d1.学生。加上(s1);
学生s2=新生(“洛奇”,“4”);
//将该学生添加到系学生列表
d1.学生。添加(s2);
学生s3=新生(“唐纳德”,“6”);
//将该学生添加到系学生列表
d1.学生。加上(s3);
//将部门添加到“部门”列表中
增加(d1);
部门d2=新部门(“B”);
学生s4=新生(“托尼”,“2”);
d2.学生。加上(s4);
增加(d2);
部门d3=新部门(“C”);
学生s5=新生(“Jai”,“3”);
d3.学生。添加(s5);
学生s6=新生(“米奇”,“5”);
d3.学生.增补(中六);
增加(d3);
//在树视图上设置itemsource
tvDepts.DataContext=部门;
tvDepts.ItemsSource=部门;
}
公共收集部门
{
获取{return\u departments;}
设置{u departments=value;}
}
}
//系班有一群学生
公共课系
{
私立大学学生;
公共部门(字符串名称)
{
_学生=新的可观察集合();
名称=名称;
}
公共字符串名称{get;set;}
/// 
///系内学生的收集
/// 
公选学生
{
获取{return\u students;}
设置{u students=value;}
}
}
//学生班
公立班学生
{
公立学生(字符串名称、字符串代码)
{
StudentName=姓名;
代码=代码;
}
公共字符串StudentName{get;set;}
公共字符串代码{get;set;}
}
}
希望这有助于您理解:)

using System.Collections.ObjectModel;
using System.Windows;

namespace WpfTestTreeView
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        private ObservableCollection<Department> _departments;

        public MainWindow()
        {
            InitializeComponent();

            // This is a long winded way but it shows the mechanics of the collections 

            _departments = new ObservableCollection<Department>();
            //Create New Depaertment and Student objects
            Department d1 = new Department("A");
            Student s1 = new Student("John","1");
            // Add the Student to the Department Student List
            d1.Students.Add(s1);
            Student s2 = new Student("Rocky", "4");
            // Add the Student to the Department Student List
            d1.Students.Add(s2);
            Student s3 = new Student("Donald", "6");
            // Add the Student to the Department Student List
            d1.Students.Add(s3);
            // Add the Department to The Departments List
            Departments.Add(d1);

            Department d2 = new Department("B");
            Student s4 = new Student("Tony", "2");
            d2.Students.Add(s4);
            Departments.Add(d2);

            Department d3 = new Department("C");
            Student s5 = new Student("Jai", "3");
            d3.Students.Add(s5);
            Student s6 = new Student("Mickey", "5");
            d3.Students.Add(s6);
            Departments.Add(d3);

            // set itemsource on the treeview
            tvDepts.DataContext = Departments;
            tvDepts.ItemsSource = Departments;

        }

        public ObservableCollection<Department> Departments
        {
            get { return _departments; }
            set { _departments = value; }
        }
    }

    // Department Class Holds a Collection of Students
    public class Department
    {

        private ObservableCollection<Student> _students;

        public Department(string name)
        {
            _students = new ObservableCollection<Student>();

            Name = name;
        }

        public string Name { get; set; }
        /// <summary>
        /// Collection Of Student in the Department
        /// </summary>
        public ObservableCollection<Student> Students
        {
            get { return _students; }
            set { _students = value; }
        }
    }
// Student Class
    public class Student
    {
        public Student(string name, string code)
        {
            StudentName = name;
            Code = code;
        }
        public string StudentName { get; set; }
        public string Code { get; set; }
    }
}