Skip to main content

PagedSource Class

The paged source. This source is obsolete. Use the PagedAsyncSource instead.

Namespace: DevExpress.Xpf.Data

Assembly: DevExpress.Xpf.Core.v22.2.dll

NuGet Package: DevExpress.Wpf.Core


public sealed class PagedSource :


Refer to the Virtual Sources topic to learn more.



The PagedSource is obsolete. Use the PagedAsyncSource instead.



The PagedSource raises events consecutively in the UI Thread and processes data in a single separate Working Thread.


  1. The PagedSource creates a single separate Working Thread to process data.
  2. The PagedSource raises the PagedSource.CreateSource event. Handle this event to create an object used to request data (e.g., DbContext for EF, UnitOfWork for XPO).
  3. (Optional step) The PagedSource raises the PagedSource.GetTotalSummaries event. Handle this event and process summaries if you want to show them in the GridControl.
  4. The PagedSource raises raises the PagedSource.FetchPage event to get the first portion of data.
  5. When end users navigate to the next page, The PagedSource raises the PagedSource.FetchPage event to get the next portion of data.
  6. (Optional step) When end users apply a filter, The PagedSource raises the PagedSource.GetUniqueValues event to get unique values and show them in a drop-down filter.


Only values of the Char, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal, DateTime, String, Guid, Enum types are available in the UI Thread.

For other types, the UI Thread creates thread-safe proxy objects. You can allow access to these values in the following ways:


  • In addition to the PagedSource.FetchPage event, you should handle the PagedSource.CreateSource and PagedSource.DisposeSource) events:

    source.CreateSource += (o, e) => {
        e.Source = new IssuesContext();
    source.DisposeSource += (o, e) => {
        var issuesContext = (IssuesContext)e.Source;
  • Get the IssuesContext before you obtain rows:

    static FetchRowsResult FetchRows(FetchRowsEventArgs e) {
        // ...
        var issuesContext = (IssuesContext)e.Source;            
        var issues = issuesContext.GetIssues(
        page: e.Skip / pageSize, 
        pageSize: pageSize, 
        sortOrder: sortOrder, 
        filter: filter);
        // ...
    static object[] GetTotalSummaries(GetSummariesEventArgs e) {
        // ...
        var issuesContext = (IssuesContext)e.Source;
        var summaryValues = issuesContext.GetSummaries(filter);
        // ...
  • In the PagedSource.FetchPage handler, return a list of objects separately and specify the FetchPageEventArgs.HasMoreRows property:

    source.FetchRows += (o, e) => {
        var fetchRowsResult = FetchRows(e);
        e.Result = fetchRowsResult.Rows;
        e.HasMoreRows = fetchRowsResult.HasMoreRows;
  • You can specify the PagedSourceBase.PageSize property to set the maximum number of rows that can be displayed on a page.

  • You can set the PagedSourceBase.PageNavigationMode property to Arbitrary to allow navigating to any page.
  • To show a total page count:

    1. Set the PagedSourceBase.PageNavigationMode property to ArbitraryWithTotalPageCount.
    2. Handle the PagedSource.GetTotalSummaries event to calculate the Count value.
See Also