目录
一、TreeView 树形列表效果

二、编码关系示意图

三、主要编码
- 定义班级类
using ScoreTools.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
namespace ScoreTools.Models
{
/// <summary>
/// 班级对象,每个班级对象中包含班级名称和一个班级学生成绩集合
/// </summary>
public class Grade : NotifycationBase
{
private string _GradeName;
public string GradeName
{
get { return this._GradeName; }
set
{
this._GradeName = value;
RaisePropertyChanged(() => GradeName);
}
}
private ObservableCollection<StudentSCore> _Scores;
public ObservableCollection<StudentSCore> GradeChildScores
{
get { return this._Scores; }
set
{
this._Scores = value;
RaisePropertyChanged(() => GradeChildScores);
}
}
public Grade(string gradeName,ObservableCollection<StudentSCore> gradeChildScores)
{
this.GradeName = gradeName;
this.GradeChildScores = gradeChildScores;
}
}
}
- ViewModel(GradesList集合和前端面xaml绑定)
private ObservableCollection<StudentSCore> _Stulist = new ObservableCollection<StudentSCore>();
public ObservableCollection<StudentSCore> Stulist
{
get { return this._Stulist; }
set
{
this._Stulist = value;
RaisePropertyChanged(() => Stulist);
}
}
private ObservableCollection<Grade> _GradesList;
public ObservableCollection<Grade> GradesList//和前端面xaml绑定
{
get { return this._GradesList; }
set
{
this._GradesList = value;
RaisePropertyChanged(() => GradesList);
}
}
- GradesList数据获取
public ObservableCollection<Grade> GetGradesAndScores()
{
SQLiteConnection conn=new SQLiteConnection(SqliteHelper.connStr);
SQLiteCommand cmd = conn.CreateCommand();
cmd.CommandText = "Select distinct 班级 from ScoresInfo order by cast(substr(班级,4,LENGTH(班级)-3) as int)"; //列具有唯一值
SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds, "gradeTable");
cmd.CommandText= "Select * from ScoresInfo";
adapter.Fill(ds, "ScoresTable");
//为上面创建的两张表之间建立关系
DataColumn parentColumn = ds.Tables["gradeTable"].Columns["班级"]; //得到父表中要用于关系的列
DataColumn childColumn = ds.Tables["ScoresTable"].Columns["班级"]; //得到子表中要用于关系的列
DataRelation relation = new DataRelation("xxx", parentColumn, childColumn);//新建关系,括号中的参数分别是(约束名,父表字段,子表字段)
ds.Relations.Add(relation);//将约束关系添加
ObservableCollection<Grade> grades = new ObservableCollection<Grade>();
foreach (DataRow gradeRow in ds.Tables["gradeTable"].Rows)
{
ObservableCollection<StudentSCore> sCores = new ObservableCollection<StudentSCore>();
foreach (DataRow scoreRow in gradeRow.GetChildRows(relation)) //gradeRow.GetChildRows(relation)
{
StudentSCore stu = CreateStudentUnit(scoreRow);
sCores.Add(stu);
}
grades.Add(new Grade(gradeRow["班级"].ToString(), sCores));
}
return grades;
}
- xaml前端代码
<TextBlock Grid.Row="0" Margin="15,0,5,0" HorizontalAlignment="Left"
Text="{Binding Path=GradesList.Count,Mode=OneWay, StringFormat=班级列表 ({0}个)}"/>
<TreeView x:Name="gradeTree" Grid.Row="1" Grid.RowSpan="2" Margin="1,0,5,0"
ItemsSource="{Binding GradesList}" Width="180"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
SelectedItemChanged="TreeView_SelectedItemChanged" >
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding GradeChildScores}">
<StackPanel Margin="0 0 0 0" Orientation="Horizontal">
<TextBlock Text="{Binding GradeName}" />
<TextBlock Text="{Binding GradeChildScores.Count, StringFormat= ' ({0}名)'}" />
</StackPanel>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding 姓名}"/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
- SelectedItemChanged
SchoolWindowViewModel viewModel;
private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
//每次选择前取得视图
view = (ListCollectionView)CollectionViewSource.GetDefaultView(viewModel.Stulist);
if (gradeTree.SelectedValue is Grade)
{
Grade grade = (Grade)gradeTree.SelectedValue;
string filterWord = grade.GradeName;
StuFilter filter;
if (view != null)
{
filter = new StuFilter(filterWord);
view.Filter = new Predicate<object>(filter.FilterItemByClass);
view.Refresh();
}
}
else
{
StudentSCore student = (StudentSCore)gradeTree.SelectedValue;
string filterWord = student.姓名;
StuFilter filter;
if (view != null)
{
filter = new StuFilter(filterWord);
view.Filter = new Predicate<object>(filter.FilterItemByName);
view.Refresh();
}
}
}
实践是最好的老师!
这篇博客详细记录了如何在WPF应用中开发学生成绩管理工具,通过TreeView组件创建班级的树形列表。内容包括TreeView的显示效果,编码逻辑的示意图,以及关键代码实现,如班级类的定义,ViewModel与前端XAML的绑定,数据获取及Selected Item变化处理。
388

被折叠的 条评论
为什么被折叠?



