使用 MVVM 在树视图中显示实体

本文关键字:显示 实体 视图 MVVM 使用 | 更新日期: 2023-09-27 18:36:28

我正在按照MVVM模式制作WPF应用程序。在此我正在使用实体框架,

我的实体结构很简单,它有3个实体:部门,课程,书籍,

一个系可以有很多课程,

一个课程可以有很多书,

现在我想在树视图中显示它,所以我在 WPF 中的输出应该如下所示,

Department1
  Course1
    Book1
    Book2
  Course2
    Book3
Department2
  Course
     Book
Department3   

在我的视图模型中,我有实体上下文对象。但是我不知道如何在树视图中显示这一点。我怎么能做到这一点。

使用 MVVM 在树视图中显示实体

我准备了小样本来复制这个。

<Window x:Class="TestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:this="clr-namespace:TestApp"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <this:TreeViewModel />
    </Window.DataContext>
    <Window.Resources>
        <HierarchicalDataTemplate ItemsSource="{Binding Courses}" DataType="{x:Type this:Department}">
            <Label Content="{Binding DepartmentName}"/>
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Books}" DataType="{x:Type this:Course}">
            <Label Content="{Binding CourseName}"/>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type this:Book}">
            <Label Content="{Binding BookName}"/>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <TreeView ItemsSource="{Binding Departments}">
        </TreeView>
    </Grid>
</Window>
模型

和视图模型类。

public class Book :ViewModelBase
    {
        private string bookname = string.Empty;
        public string BookName
        {
            get
            {
                return bookname;
            }
            set
            {
                bookname = value;
                OnPropertyChanged("BookName");
            }
        }
        public Book(string bookname)
        {
            BookName = bookname;
        }
    }

部门类

public class Department : ViewModelBase
    {
        private List<Course> courses;
        public Department(string depname)
        {
            DepartmentName = depname;
            Courses = new List<Course>()
            {
                new Course("Course1"),
                new Course("Course2")
            };
        }
        public List<Course> Courses
        {
            get
            {
                return courses;
            }
            set
            {
                courses = value;
                OnPropertyChanged("Courses");
            }
        }
        public string DepartmentName
        {
            get;
            set;
        }
    }

课程类

public class Course :ViewModelBase
    {
        private List<Book> books;
        public Course(string coursename)
        {
            CourseName = coursename;
            Books = new List<Book>()
            {
                new Book("JJJJ"),
                new Book("KKKK"),
                new Book("OOOOO")
            };
        }
        public List<Book> Books
        {
            get
            {
                return books;
            }
            set
            {
                books = value;
                OnPropertyChanged("Books");
            }
        }
        public string CourseName
        {
            get;
            set;
        }
    }

树视图模型类。

public class TreeViewModel :ViewModelBase
    {
        private List<Department> departments;
        public TreeViewModel()
        {
            Departments = new List<Department>()
            {
                new Department("Department1"),
                new Department("Department2")
            };
        }
        public List<Department> Departments
        {
            get
            {
                return departments;
            }
            set
            {
                departments = value;
                OnPropertyChanged("Departments");
            }
        }
    }

视图模型基类。

public class ViewModelBase :INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged(string propname)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propname));
            }
        }
    }

最后,它以分层格式显示数据。我希望这会让你满意...

您必须为此定义层次结构数据模板模板 下面是如何使用它的示例。

基于"David Bekham"的回答,我创建了一个更通用的方式来显示项目

跳跃它有帮助:

定义通用分层数据模板

   <HierarchicalDataTemplate 
      ItemsSource="{Binding ChildItems}" 
      DataType="{x:Type viewModels:TVItemViewModel}">
                   <Label Content="{Binding Name}" />
    </HierarchicalDataTemplate>
这里是视图模型

(如果你的内容是非静态的,你需要实现视图模型基类)

public class TVItemViewModel 
    {
        private bool isSelected;
        private string name;
        public TVItemViewModel(string name)
        {
            this.Name = name;
        }
        public string Name
        {
            get => name;
            set => name= value;
        }
        public bool IsSelected
        {
            get => isSelected;
            set =>  isSelected= value;
        }
        public ObservableCollection<TVItemViewModel> ChildItems { get; set; }
    }

在 MainViewModel 中,我创建了一个根集合,例如

 TvItems = new ObservableCollection<TVItemViewModel>() 
            { new TVItemViewModel("RootItem1") 
                { ChildItems = new ObservableCollection<TVItemViewModel>() 
                    { new TVItemViewModel("Child1"), 
                       new TVItemViewModel("Child2"), 
                        new TVItemViewModel("Child3)
                    }
                }
            };

我希望有人觉得这很有用

我们需要为我们想要的嵌套级别定义 HierachialDataTemplate 的 'n' 级。我们将有 HierarchicalDataTemplate 类的 ItemsSource 属性来定义它。我们也可以对菜单控件做同样的事情。