0

我正在尝试为 Silverlight 创建一个包含数据网格和数据寻呼机的 MVVM 友好页面。在我的视图模型上,我实现了 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"); }
    }

XAML 可以很好地绑定到项目,并且数据网格在最初加载时显示前五个项目。

<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" />

获取折扣然后设置总计数的相关代码全部执行并且数字达到我的预期(返回的项目为 5,所有折扣的总数为 9)

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");
    }

但是datapager似乎没有发现有超过5个折扣。我可以看到 TotalItemCount 设置正确。奇怪的是,除了设置值之外,任何其他代码都不会调用 TotalItemCount 属性。数据分页器不应该使用它来确定是否可以单击 Prev / Next / First / Last 按钮?

更新 所以我在订阅 MouseEnter 事件时查看了 DataPager,发现了一些有趣的东西。ItemCount 是 5,无论我在 ViewModel 上将其设置为什么(例如,手动将其设置为 9),DataPager 都只会查看其集合中的项目以确定实际有多少项目。它不是从 ViewModel 类中读取这些值。我想我读到如果周围的上下文实现 IPagedCollectionView,DataPager 将使用这些方法来确定大小/页面/等。

4

2 回答 2

1

DataPager 控件Source属性应绑定到集合。不是 DataGrid 控件的ItemsSource属性。

DataPager.Source 属性

源可以是任何 IEnumerable 集合。当绑定到不实现 IPagedCollectionView 的 IEnumerable 时,DataPager 的行为就像所有数据都在一个页面上一样。设置 DataPager 属性不会对控件产生任何影响。

通常,源是实现 IPagedCollectionView 的集合。IPagedCollectionView 提供分页功能,DataPager 控件提供与 IPagedCollectionView 交互的用户界面。要为 IEnumerable 集合提供分页功能,可以将其包装在 PagedCollectionView 类中。

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;
于 2011-01-28T19:40:56.463 回答
0

我注意到您正在使用 WCF RIA 服务。在更简单的场景中,您可以简单地将 DataGrid 和 DataPager 绑定到 DomainDataSource,而无需实现任何东西。但我猜你有一个更复杂的要求,这就是为什么你要手动做所有事情。

于 2011-09-28T12:22:26.843 回答