Silverlight 为什么DataPager没有';我不能记下我的总数吗?

Silverlight 为什么DataPager没有';我不能记下我的总数吗?,silverlight,mvvm,datapager,Silverlight,Mvvm,Datapager,我正在尝试创建一个MVVM友好的页面,其中包含一个datagrid和Silverlight的数据寻呼机。在我的viewmodel上,我实现了IPagedCollectionView接口 public class DiscountViewModel : INotifyPropertyChanged, IPagedCollectionView 我已经实现了获取ItemCount和TotalItemCount所需的所有方法 public bool CanChangePage { ge

我正在尝试创建一个MVVM友好的页面,其中包含一个datagrid和Silverlight的数据寻呼机。在我的viewmodel上,我实现了IPagedCollectionView接口

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;