做英文网站地图,买域名送网站空间,wordpress mingle,加拿大28平台微信文章目录 前言相关链接代码仓库项目配置#xff08;省略#xff09;项目初始配置xamlviewModel Filter过滤详细代码展示结果问题 Linq过滤CollectionDataxamlviewModel sql#xff0c;这里用到数据库#xff0c;就不展开了 总结 前言
我们这次详细了解一下列表通知的底层是… 文章目录 前言相关链接代码仓库项目配置省略项目初始配置xamlviewModel Filter过滤详细代码展示结果问题 Linq过滤CollectionDataxamlviewModel sql这里用到数据库就不展开了 总结 前言
我们这次详细了解一下列表通知的底层是怎么实现的
相关链接 十月的寒流 WPF 中如何制作 DataGrid 的分页功能 代码仓库
我为了方便展示源代码我将代码提交到了代码仓库里面 B站【十月的寒流】对应课程的代码 Github仓库 项目配置省略
想要看的话看我前面的文章就可以了
项目初始配置
和我之前的代码差不多详细的就看我的源码好了我会用TabItem来简单说明的。这就是初始配置的代码了 xaml
UserControl x:ClassDataGrid_Pagination.Views.Demo1Viewxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006 xmlns:dhttp://schemas.microsoft.com/expression/blend/2008 xmlns:localclr-namespace:DataGrid_Pagination.Viewsmc:Ignorabled xmlns:hchttps://handyorg.github.io/handycontrolxmlns:viewModelsclr-namespace:DataGrid_Pagination.ViewModelsd:DesignHeight450 d:DesignWidth800UserControl.DataContextviewModels:Demo1ViewModel x:NameViewModel//UserControl.DataContextDockPanelhc:Pagination MaxPageCount10DockPanel.DockBottomMargin4 7PageIndex5IsJumpEnabledTrue /DataGrid ItemsSource{Binding CollectionData.Data}/DataGrid/DockPanel
/UserControl
viewModel
namespace DataGrid_Pagination.ViewModels
{public partial class Demo1ViewModel : ObservableObject{public Demo1View Demo1View { get; set; }[ObservableProperty]private CollectionDataStudent collectionData new CollectionDataStudent();public Demo1ViewModel(){CollectionData new CollectionDataStudent() {Data new Student().FakeMany(10)};CollectionData.Init();CollectionData.CollectionView.Refresh();}}
}Filter过滤 详细代码
UserControl x:ClassDataGrid_Pagination.Views.Demo2Viewxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006 xmlns:dhttp://schemas.microsoft.com/expression/blend/2008 xmlns:localclr-namespace:DataGrid_Pagination.Viewsmc:Ignorabled xmlns:hchttps://handyorg.github.io/handycontrolxmlns:viewModelsclr-namespace:DataGrid_Pagination.ViewModelsd:DesignHeight450 d:DesignWidth800UserControl.DataContextviewModels:Demo2ViewModel x:NameViewModel//UserControl.DataContextDockPanelhc:Pagination MaxPageCount{Binding PageCount}DockPanel.DockBottomMargin4 7PageIndex{Binding PageIndex,ModeTwoWay}IsJumpEnabledTrue /DataGrid ItemsSource{Binding CollectionData.Data}/DataGrid/DockPanel
/UserControl namespace DataGrid_Pagination.ViewModels
{public partial class Demo2ViewModel : ObservableObject{public Demo2View View { get; set; }[ObservableProperty]private CollectionDataStudent collectionData new CollectionDataStudent();private int pageIndex 1;public int PageIndex{get pageIndex;set {SetProperty(ref pageIndex, value);CollectionData.CollectionView.Refresh();}}public readonly int PageSize 10;[ObservableProperty]private int pageCount 1;public Demo2ViewModel(){CollectionData new CollectionDataStudent(){Data new Student().FakeMany(150)};CollectionData.Binding();CollectionData.CollectionView.CollectionChanged (s, e) {var count CollectionData.Data.ToList().Count;PageCount (int)Math.Ceiling((decimal)(count / PageSize));};CollectionData.CollectionView.Filter (item) {if (!(item is Student)){throw new Exception(属性类型不为Student);}var index CollectionData.Data.ToList().IndexOf((Student)item);return PageIndex index / PageSize 1;};CollectionData.CollectionView.Refresh();}}
}展示结果 问题
小数据量没问题但是大数据会出问题。因为主要的计算是indexOf和每个项的Filter。o(n)*o(n)o(n^2)复杂度太高了。
Linq过滤
Linq过滤就是我们每次都更新CollectionView绑定的对象触发更新 CollectionData public partial class CollectionDataT:ObservableObject where T : class{[ObservableProperty]private IEnumerableT data new ListT();public ICollectionView CollectionView { get; set; }public CollectionData() { }public void Binding(){CollectionView CollectionViewSource.GetDefaultView(Data);}}xaml
UserControl x:ClassDataGrid_Pagination.Views.Demo3Viewxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006xmlns:dhttp://schemas.microsoft.com/expression/blend/2008xmlns:localclr-namespace:DataGrid_Pagination.Viewsmc:Ignorabledxmlns:hchttps://handyorg.github.io/handycontrolxmlns:viewModelsclr-namespace:DataGrid_Pagination.ViewModelsd:DesignHeight450d:DesignWidth800UserControl.DataContextviewModels:Demo3ViewModel x:NameViewModel //UserControl.DataContextDockPanelhc:Pagination MaxPageCount{Binding PageCount}DockPanel.DockBottomMargin4 7PageIndex{Binding PageIndex,ModeTwoWay}IsJumpEnabledTrue /DataGrid ItemsSource{Binding CollectionData.Data}/DataGrid/DockPanel
/UserControl
viewModel namespace DataGrid_Pagination.ViewModels
{public partial class Demo3ViewModel : ObservableObject{public Demo3View View { get; set; }[ObservableProperty]private CollectionDataStudent collectionData new CollectionDataStudent();private int pageIndex 1;public int PageIndex{get pageIndex;set{SetProperty(ref pageIndex, value);CollectionData.CollectionView.Refresh();}}public readonly int PageSize 10;[ObservableProperty]private int pageCount 1;public readonly ListStudent Students new Student().FakeMany(150).ToList();public Demo3ViewModel(){CollectionData new CollectionDataStudent(){Data Students.Take(PageSize),};CollectionData.Binding();CollectionData.CollectionView.CollectionChanged (s, e) {var count Students.Count;PageCount (int)Math.Ceiling((decimal)(count / PageSize));CollectionData.Data Students.Skip((PageIndex - 1) * PageSize).Take(PageSize);};}}
}sql这里用到数据库就不展开了
总结
分页是我们最常用的功能这次简单实现了分页的效果。HandyControl没有提供主动的分页需要我们组合一下。详细代码可以看我的Github仓库。三种过滤我都写了。