使用 MVVM 在树视图中显示实体
本文关键字:显示 实体 视图 MVVM 使用 | 更新日期: 2023-09-27 18:36:28
我正在按照MVVM模式制作WPF应用程序。在此我正在使用实体框架,
我的实体结构很简单,它有3个实体:部门,课程,书籍,
一个系可以有很多课程,一个课程可以有很多书,
现在我想在树视图中显示它,所以我在 WPF 中的输出应该如下所示,
Department1
Course1
Book1
Book2
Course2
Book3
Department2
Course
Book
Department3
在我的视图模型中,我有实体上下文对象。但是我不知道如何在树视图中显示这一点。我怎么能做到这一点。
我准备了小样本来复制这个。
<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 属性来定义它。我们也可以对菜单控件做同样的事情。