[Silverlight entry series] Using mvvm to enable datapager paging control to implement server-side Paging

Source: Internet
Author: User

In the previous article, we implemented how to enable the datapager control in silverlight4 to implement server-side paging instead of client paging, in the server-side WCF Ria service, we implement a function to retrieve the total number of pages and a function to retrieve data by page number. Today, I will add that the front-end part is implemented in the mvvm mode. It is also relatively simple.

View/XAML

Let's take a look at the XAML.CodeWe implement a DataGrid and a datapager with a busyindicator. When the DataGrid loads data, a progress bar is automatically displayed and the following controls are grayed out. This is bound to isbusy of viewmodel, the specific implementation is my other articleArticle. Code:

 <  Usercontrol  X: Class  = "Mysilverlightapplication"  
Xmlns = "Http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Xmlns: x = "Http://schemas.microsoft.com/winfx/2006/xaml"
Xmlns: d = "Http://schemas.microsoft.com/expression/blend/2008"
Xmlns: I = "Http://schemas.microsoft.com/expression/2010/interactivity"
Xmlns: MC = "Http://schemas.openxmlformats.org/markup-compatibility/2006"
MC: ignorable = "D"
D: Height = "Auto" D: width = "Auto" Xmlns: SDK = "Http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" Xmlns: Toolkit = "Http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit" >
< Grid X: Name = "Layoutroot" Background = "White" >
< Toolkit: headeredcontentcontrol Name = "Headeredcontentcontrol1" Width = "Auto" >
< Toolkit: busyindicator Name = "Busyindicator1" Isbusy =" {Binding isbusy} " Displayafter = "0" Busycontent = "Fetching data ..." >
< SDK: DataGrid Autogeneratecolumns = "False" Gridlinesvisibility = "NONE" Width = "Auto" Horizontalalignment = "Stretch" Verticalalignment = "Stretch" Borderthickness = "0, 0, 0" Selectionmode = "Single" Name = "Dgvrecentupdated" Isreadonly = "True" >
< SDK: DataGrid. Columns >
< SDK: datagridtextcolumn Header = "Productid" Binding =" {Binding productid} " Visibility = "Collapsed" />
< SDK: datagridtextcolumn Header = "Product name" Binding =" {Binding name} " Width = "120" />
< SDK: datagridtextcolumn Header = "Product Desc" Binding =" {Binding DESC} " Width = "120" />
</ SDK: DataGrid. Columns >
</ SDK: DataGrid >
</ Toolkit: busyindicator >
</ Toolkit: headeredcontentcontrol >
< SDK: datapager Height = "25" Horizontalalignment = "Stretch" Name = "Datapager1" Source =" {Binding pagercontext} " Verticalalignment = "Bottom" Width = "Auto" >
< I: interaction. triggers >
< I: eventtrigger Eventname = "Pageindexchanged" >
< I: invokecommandaction Command =" {Binding setresultsbypagercommand} " Commandparameter =" {Binding pageindex, elementname = datapager1, mode = oneway} " />
</ I: eventtrigger >
</ I: interaction. triggers >
</ SDK: datapager >
</ Grid >
</ Usercontrol >

Note the source binding of datapager. The pageindexchanged event is bound to the command. The parameter of the Bound event is the page number of the pageindex-request.

View model viewmodel

First, bind the pageindexchanged event.Setresultsbypagercommand :

 //  In viewmodel Constructor  
Setresultsbypagercommand = New Delegatecommand (setresultsbypager, cansetresultsbypager );

// ....

Private Int _ Pagesize = 10 ;

Public Icommand setresultsbypagercommand { Get ; Set ;}

Public Void Setresultsbypager ( Object Param)
{
// Call the WCF Ria service to obtain the data of the current page number.
Performquery < Myentity > (
Mydomaincontext. getdataquery ( " 234 " , _ Pagesize,
Convert. toint32 (PARAM) + 1 ), // This is the current page number.
Getmydatacomplete ); // Update the DataGrid model in this event. The automatic notification page is displayed.
}

Private Bool Cansetresultsbypager ( Object Param)
{
Return True ;
}

Then implement the source-pagercontext bound to datapager:

 Private  List  <  Int  >  Pageritemscount;
Private Pagedcollectionview _ pagercontext;

Public Pagedcollectionview pagercontext
{
Get
{
If (Pageritemscount = Null )
Pageritemscount = New List < Int > ();

If (_ Pagercontext = Null )
{
Pagedcollectionview PCV = New Pagedcollectionview (pageritemscount );
PCV. pagesize = 1 ;

_ Pagercontext = PCV;
}
Return _ Pagercontext;
}
Set
{
If (Pagercontext = Value)
Return ;

_ Pagercontext = Value;
Notifypropertychanged ( " Pagercontext " ); // Datapager will be automatically refreshed
}
}

The last step is to initialize datapager, or get the total number of pages from the server where you need the data and load the datapager source. For example:

 Mydomaincontext. gettotalpages (  "  123  "  ,
_ Pagesize, S =>
{
If ( ! S. haserror)
{
If (Pageritemscount ! = Null )
Pageritemscount. Clear ();

For ( Int I = 1 ; I <= S. value; I ++ )
Pageritemscount. Add (I );

Pagedcollectionview PCV = New Pagedcollectionview (pageritemscount );
PCV. pagesize = 1 ;

Pagercontext = PCV; // Refresh the source bound to datapager
Setresultsbypager ( 0 ); // Force jump to the first page. This step can also be omitted. If you load this view during initialization.
}
Else
{
// An error occurred in the notification.
// If (loadingcompletefailed! = NULL)
// Loadingcompletefailed (this, new resultsargs (S. Error ));
}

}, Null );

The entire logic is: obtain the total number of pages from the server> bind to the source of datapager when asynchronous completion> automatically trigger indexchanged> load data on the specified page from the server and display> Users can navigate to the previous page next page ....

In this way, we do not have any code in *. XAML. CS, And the mvvm mode is very refreshing! (BTW: next article describes how to automatically hide the page control datapager when there is only one page)

(Note:: It is unnecessary to bind the pagesize attribute and currentindex attribute of datapager to viewmodel. The pageindex of datapager will automatically manage the current page number. There is no need to set pagesize because we calculate the number of pages on the server !)

Domain datasource Control

If you use toolkitDomaindatasource ControlTo handle paging, sorting, filtering... ignore this article, because every time it is take = 100, only the data on this page is taken, but this control is not in mvvm mode, please note)

More powerful server-side paging/sorting/filtering/search-mvvm-friendly

View my article entitylist/domaincollectionview/domaincollectionviewloader

 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.