Como posso paginar um DataGrid do WPF?

Como posso definir paginação em um DataGrid wpf?

O artigo do projeto de código acima é muito bom para fazer isso com as tabelas do ADO. Enquanto para a maioria das aplicações, é provável que funcione muito bem, e é fácil de entender, existe uma maneira mais “semelhante a WPF-zen” para fazê-lo também, e isso seria usar CollectionViews. A vantagem de usar um CollectionView comparado ao exemplo acima é que ele é um pouco mais geral em termos de quais dados você está colocando em sua grade (não que você não possa tornar esse exemplo mais geral), e se encheckbox bem com o modelo geral de binding de dados do WPF. Ele oferece um local para suporte a operações comuns, como sorting, agrupamento, etc., se você precisar delas.

Eu reuni um exemplo muito curto de um PagingCollectionView mal trabalhando vinculado ao controle DataGrid do .NET 4.0. Embora o exemplo em si seja bastante trivial, ele mostra pelo menos como começar, já que você tem um proxy em torno da coleção real de dados na qual é possível executar operações simples como MoveToNextPage e MoveToPreviousPage.

Aqui está o C # para o tratamento de events do Windows e o PagingCollectionView:

 using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Windows; using System.Windows.Data; namespace GridPagingExample { public partial class MainWindow : Window { private readonly PagingCollectionView _cview; public MainWindow() { InitializeComponent(); this._cview = new PagingCollectionView( new List { new { Animal = "Lion", Eats = "Tiger" }, new { Animal = "Tiger", Eats = "Bear" }, new { Animal = "Bear", Eats = "Oh my" }, new { Animal = "Wait", Eats = "Oh my isn't an animal" }, new { Animal = "Oh well", Eats = "Who is counting anyway" }, new { Animal = "Need better content", Eats = "For posting on stackoverflow" } }, 2 ); this.DataContext = this._cview; } private void OnNextClicked(object sender, RoutedEventArgs e) { this._cview.MoveToNextPage(); } private void OnPreviousClicked(object sender, RoutedEventArgs e) { this._cview.MoveToPreviousPage(); } } public class PagingCollectionView : CollectionView { private readonly IList _innerList; private readonly int _itemsPerPage; private int _currentPage = 1; public PagingCollectionView(IList innerList, int itemsPerPage) : base(innerList) { this._innerList = innerList; this._itemsPerPage = itemsPerPage; } public override int Count { get { if (this._innerList.Count == 0) return 0; if (this._currentPage < this.PageCount) // page 1..n-1 { return this._itemsPerPage; } else // page n { var itemsLeft = this._innerList.Count % this._itemsPerPage; if (0 == itemsLeft) { return this._itemsPerPage; // exactly itemsPerPage left } else { // return the remaining items return itemsLeft; } } } } public int CurrentPage { get { return this._currentPage; } set { this._currentPage = value; this.OnPropertyChanged(new PropertyChangedEventArgs("CurrentPage")); } } public int ItemsPerPage { get { return this._itemsPerPage; } } public int PageCount { get { return (this._innerList.Count + this._itemsPerPage - 1) / this._itemsPerPage; } } private int EndIndex { get { var end = this._currentPage * this._itemsPerPage - 1; return (end > this._innerList.Count) ? this._innerList.Count : end; } } private int StartIndex { get { return (this._currentPage - 1) * this._itemsPerPage; } } public override object GetItemAt(int index) { var offset = index % (this._itemsPerPage); return this._innerList[this.StartIndex + offset]; } public void MoveToNextPage() { if (this._currentPage < this.PageCount) { this.CurrentPage += 1; } this.Refresh(); } public void MoveToPreviousPage() { if (this._currentPage > 1) { this.CurrentPage -= 1; } this.Refresh(); } } } 

Aqui está o XAML para a janela:

                     

Você poderia construir este CollectionView para suportar mais funcionalidades, algumas triviais, como MoveToLastPage e MoveToFirstPage, e algumas que levarão um pouco mais de consideração sobre como você deseja que ele se comporte, como a sorting. Espero que seja útil.