Silverlight 为什么DataPager没有';我不能记下我的总数吗?
我正在尝试创建一个MVVM友好的页面,其中包含一个datagrid和Silverlight的数据寻呼机。在我的viewmodel上,我实现了IPagedCollectionView接口Silverlight 为什么DataPager没有';我不能记下我的总数吗?,silverlight,mvvm,datapager,Silverlight,Mvvm,Datapager,我正在尝试创建一个MVVM友好的页面,其中包含一个datagrid和Silverlight的数据寻呼机。在我的viewmodel上,我实现了IPagedCollectionView接口 public class DiscountViewModel : INotifyPropertyChanged, IPagedCollectionView 我已经实现了获取ItemCount和TotalItemCount所需的所有方法 public bool CanChangePage { ge
public class DiscountViewModel : INotifyPropertyChanged, IPagedCollectionView
我已经实现了获取ItemCount和TotalItemCount所需的所有方法
public bool CanChangePage {
get { return TotalItemCount > PageIndex * PageSize; }
}
public bool IsPageChanging {
get { return false; }
}
public int ItemCount {
get { return itemCount; }
set { itemCount = value; RaisePropertyChange("ItemCount"); }
}
public bool MoveToFirstPage() {
PageChanging(this, new PageChangingEventArgs(PageIndex));
PageIndex = 0;
PageChanged(this, null);
return true;
}
public bool MoveToLastPage() {
throw new NotImplementedException();
}
public bool MoveToNextPage() {
PageChanging(this, new PageChangingEventArgs(PageIndex));
PageIndex++;
PageChanged(this, null);
return true;
}
public bool MoveToPage(int pageIndex) {
PageChanging(this, new PageChangingEventArgs(PageIndex));
PageIndex = pageIndex;
PageChanged(this, null);
return true;
}
public bool MoveToPreviousPage() {
PageChanging(this, new PageChangingEventArgs(PageIndex));
PageIndex--;
PageChanged(this, null);
return true;
}
public event EventHandler<EventArgs> PageChanged;
public event EventHandler<PageChangingEventArgs> PageChanging;
public int PageIndex {
get { return pageIndex; }
set { pageIndex = value; RaisePropertyChange("PageIndex"); }
}
public int PageSize {
get { return pageSize; }
set { pageSize = value; RaisePropertyChange("PageSize"); }
}
public int TotalItemCount {
get { return totalItemCount; }
set { totalItemCount = value; RaisePropertyChange("TotalItemCount"); }
}
public bool canchange页面{
获取{return TotalItemCount>PageIndex*PageSize;}
}
公共广播节目更改{
获取{return false;}
}
公共整数项计数{
获取{return itemCount;}
设置{itemCount=value;RaisePropertyChange(“itemCount”);}
}
公共布尔移动到第一页(){
PageChanged(这是新的PageChangingEventArgs(PageIndex));
PageIndex=0;
PageChanged(此为空);
返回true;
}
公共bool MoveToLastPage(){
抛出新的NotImplementedException();
}
公共bool MoveToNextPage(){
PageChanged(这是新的PageChangingEventArgs(PageIndex));
PageIndex++;
PageChanged(此为空);
返回true;
}
公共bool移动页面(int pageIndex){
PageChanged(这是新的PageChangingEventArgs(PageIndex));
PageIndex=PageIndex;
PageChanged(此为空);
返回true;
}
公共bool MoveToPreviousPage(){
PageChanged(这是新的PageChangingEventArgs(PageIndex));
页面索引--;
PageChanged(此为空);
返回true;
}
公共事件事件处理程序页面已更改;
公共事件事件处理程序页面更改;
公共整数页索引{
获取{return pageIndex;}
设置{pageIndex=value;RaisePropertyChange(“pageIndex”);}
}
公共int页面大小{
获取{return pageSize;}
设置{pageSize=value;RaisePropertyChange(“pageSize”);}
}
公共整数TotalItemCount{
获取{return totalItemCount;}
设置{totalItemCount=value;RaisePropertyChange(“totalItemCount”);}
}
XAML可以很好地绑定到这些项,datagrid在最初加载时显示前五个项
<data:DataGrid x:Name="discountsDataGrid" ItemsSource="{Binding Discounts, Mode=TwoWay}" MinHeight="200" AutoGenerateColumns="False" SelectedItem="{Binding SelectedDiscount, Mode=TwoWay}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="RowEditEnded">
<i:InvokeCommandAction Command="{Binding SaveChangesCommand}" CommandParameter="{Binding SelectedDiscount}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<data:DataGridTextColumn Header="Discount Amount" Binding="{Binding Amount}" />
</data:DataGrid.Columns>
</data:DataGrid>
<sdk:DataPager PageSize="{Binding PageSize}" Source="{Binding Path=ItemsSource, ElementName=discountsDataGrid}" Margin="0,-1,0,0" />
获取折扣的相关代码,然后设置总计数all execute,得出的数字符合我的预期(返回的项目为5,所有折扣的总计数为9)
public void load折扣(对象参数){
EntityQuery eq=ctx.getPagedDiscontSquery(PageIndex,PageSize,“”);
等式IncludeTotalCount=真;
ctx.Load(等式,OnDiscountsLoaded,null);
}
私有void OnDiscountsLoaded(加载操作加载操作){
if(loadOperation.Error!=null){
}否则{
折扣=loadOperation.Entities;
ItemCount=loadOperation.TotalEntityCount;
ctx.GetDiscountCount(OnCountCompleted,null);
提高产权变更(“折扣”);
}
}
私有void OnCountCompleted(调用操作op){
TotalItemCount=运算值;
提高产权变更(“折扣”);
RaisePropertyChange(“TotalItemCount”);
}
但是datapager似乎没有意识到有超过5个折扣。我可以看出TotalItemCount设置正确。奇怪的是,TotalItemCount属性从来没有被任何其他代码调用过,只是用来设置值。datapager不应该使用它来确定是否可以单击Prev/Next/First/Last按钮吗
更新
所以我在订阅MouseEnter事件时查看了DataPager,发现了一些有趣的东西。ItemCount是5,无论我在ViewModel上将其设置为什么(例如,手动将其设置为9),DataPager都只查看其集合中的项,以确定实际有多少项。它不是从ViewModel类中读取这些值。我想我读到,如果周围的上下文实现了IPagedCollectionView,DataPager将使用这些方法来确定大小/页面等。DataPager控件
源属性应绑定到集合。不是DataGrid控件的ItemsSource
属性
发件人:
源可以是任意IEnumerable
收集当绑定到
无法实现的IEnumerable
IPagedCollectionView,数据寻呼机
其行为就像所有数据都位于
单页。设置数据寻呼机
属性不会对其产生任何影响
控制
通常,源是一个集合
实现IPagedCollectionView的。
IPagedCollectionView提供了
分页功能,以及
DataPager控件为用户提供
用于与
IPagedCollectionView。提供
页面的分页功能
IEnumerable集合,您可以包装
它位于PagedCollectionView类中
List itemList=new List();
//生成一些要添加到列表中的项目。
对于(int i=1;i我注意到您正在使用WCF RIA服务。在更简单的场景中,您只需将DataGrid和DataPager绑定到DomainDataSource,就不必实现任何东西。但我想您有一个更复杂的需求,这就是为什么您要手工完成所有事情的原因。您的回答让我非常接近。我的ViewModel实现的是IPagedCollectionView接口,而不是实际的底层集合(在我的例子中,只是一个IList)。
public void LoadDiscounts(Object parameter){
EntityQuery<Discount> eq = ctx.GetPagedDiscountsQuery(PageIndex, PageSize, "");
eq.IncludeTotalCount = true;
ctx.Load<Discount>(eq, OnDiscountsLoaded, null);
}
private void OnDiscountsLoaded(LoadOperation<Discount> loadOperation) {
if (loadOperation.Error != null) {
} else {
Discounts = loadOperation.Entities;
ItemCount = loadOperation.TotalEntityCount;
ctx.GetDiscountCount(OnCountCompleted, null);
RaisePropertyChange("Discounts");
}
}
private void OnCountCompleted(InvokeOperation<int> op) {
TotalItemCount = op.Value;
RaisePropertyChange("Discounts");
RaisePropertyChange("TotalItemCount");
}
List<String> itemList = new List<String>();
// Generate some items to add to the list.
for (int i = 1; i <= 33; i++)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder("Item ");
sb.Append(i.ToString());
itemList.Add(sb.ToString());
}
// Wrap the itemList in a PagedCollectionView for paging functionality
PagedCollectionView itemListView = new PagedCollectionView(itemList);
// Set the DataPager and ListBox to the same data source.
dataPager1.Source = itemListView;
listBox1.ItemsSource = itemListView;