在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>
答案 0 :(得分:0)
在实现接口时,您应该使用ObservableCollection<T>
而不是List<T>
:
因此,当您想知道集合何时发生变化时,它非常有用。触发一个事件,告诉用户添加/删除或移动了哪些条目。
如果您想要方法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"
。这将减少重新渲染新控件的次数。