我需要实现无限的列表框(当用户滚动到结尾时正在加载数据块的那个)并且我正在使用ViewModel。
我将ListBox绑定到ObservableCollection,但我不知道如何获得有关到达它的结尾的通知,而不是打破MVVM范例。 我怎样才能做到这一点?
我唯一需要知道的是如何保留MVVM功能和约束,并在集合被枚举到最后时获得通知。
感谢。
修改
我一直在挖掘一下,我担心这不是一个简单的解决方案。我认为唯一的可能性是实现自定义集合,它将实现ICollection和INotifyCollectionChanged。但我不知道ListBox和其他ItemsSource启用控件的内部机制是如何工作的,所以我不知道如何实现延迟加载。
WP控件的主要提取机制是利用ItemsSource IEnumerable接口吗?还是使用索引器方法?它如何称为计数?它取决于计数还是可以在它的生命周期中进行更改(以及哪些调用?我认为并非所有调用都可以更改Count,然后调用NotifyCollectionChanged)。
有文件吗?或者有任何可用的实现吗?
答案 0 :(得分:2)
由于这应该支持MVVM,我不会将事件绑定到列表框的一部分,而是作为Collection本身的一部分。 当请求的索引位于列表末尾时,您应该尝试添加更多块。
实现此目的的一种方法是从IList继承并监视this[int index]
属性。
例如:
public class OC<T> : IList<T>, IList
{
public T this[int index]
{
get
{
if (index >= (this.Count - 20)) // Insert correct heuristics here!
{
// Load more chunks
}
return base[index];
}
}
}
(当然Count - 20
不 这是做到这一点的最好方法,你可能想要输入自己的启发式(如果索引是在最后10%),但它显示了概念)
这样,你不关心View是使用ListBox还是组合或其他什么 - 你保持MVVM模式。当请求的当前项目是列表末尾的项目时,这是您开始加载更多块的队列......
请注意,您也希望从IList
派生,因为对于虚拟化,WPF似乎检查IList
(没有泛型)并且IList<T>
不是从{{1}派生的}}。简而言之,如果你不是从IList
派生的话
同样,将为列表中的每个项目调用索引器。
答案 1 :(得分:1)
我发现了一个很好的解决方案,它没有破坏MVVM,但却为这个问题提供了非常优雅的解决方案(看起来第一眼看来,我还没有对其进行适当的调查。) 看http://danielvaughan.orpius.com/post/Scroll-Based-Data-Loading-in-Windows-Phone-7.aspx
还有stackoverflow主题,我忽略了这一点。请看WP7 Auto Grow ListBox upon reaching the last item。