WPF只是将新项添加到绑定到ItemsControl的Collection

时间:2016-02-24 11:29:24

标签: c# wpf binding observablecollection itemscontrol

ItemsControl我放置了我的物品集。由于此集合可能非常庞大,我尝试实现一些分页 - 当滚动到可见滚动区域的末尾时,将新项目添加到ItemsControl

检测滚动底部我已从此答案How to find that ScrollViewer is scrolled to the end in WPF?

中使用

但我需要实施Adding个项目。

if (scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight &&
                _productsViewModel.ProductTotal > pageCount*ConfigurationProvider.ItemsPerProductPage)
            {
                pageCount++;
                _productsViewModel.RunPaginationWorker(pageCount);
            }

BG Worker中添加了项目。作为参数,我发送pageNumber,这是用户滚动到滚动结尾的次数。

在BG CompleteWork活动中,我收到了项目,并尝试将它们绑定到绑定到ItemsControl的属性

var items= (e.Result) as List<ItemDto>;
Items.AddRange(items);
OnPropertyChanged("Items");

但是这不起作用,似乎Property Items没有改变。

public List<ItemDto> Items
        {
            get { return _items; }
            set
            {
                _items= value;
                OnPropertyChanged("Items");
            }
        }

和Xaml绑定

<ItemsControl VerticalAlignment="Top" MaxWidth="650" HorizontalAlignment="Center" Margin="10,40,10,0" Name="Items" 
                          ItemsSource="{Binding Items}" AlternationCount="{Binding Path=Items.Count,FallbackValue='100'}">
...
</ItemsControl>

1 个答案:

答案 0 :(得分:0)

在实现接口时,您应该使用ObservableCollection<T>而不是List<T>

  • INotifyCollectionChanged
  • INotifyPropertyChanged的

因此,当您想知道集合何时发生变化时,它非常有用。触发一个事件,告诉用户添加/删除或移动了哪些条目。

如果您想要方法AddRange(),那么只需复制以下代码:

private ObservableCollection<ItemDto> _items=new ObservableCollection<ItemDto>();
public ObservableCollection<ItemDto> Items
{
    get { return _items; }
    set
    {
       _items= value;
       OnPropertyChanged("Items");
    }
}

public void AddRange(IEnumerable<T> collection)
{
    foreach (var i in collection)
    {
        Items.Add(i);
    }
}

<强>更新

如果您只想拍摄最后一项,我会建议您使用linq方法。例如,您可以跳过10个项目并接下来的10个项目:

Items=Items.Skip(10).Take(10).ToList();

更新1:

当您向集合添加新项目而您不想绘制新项目时,您应该只添加VirtualizingStackPanel.VirtualizationMode="Recycling"。这将减少重新渲染新控件的次数。