ViewModel和无尽的集合

时间:2012-11-07 11:40:59

标签: .net mvvm

我需要实现无限的列表框(当用户滚动到结尾时正在加载数据块的那个)并且我正在使用ViewModel。

我将ListBox绑定到ObservableCollection,但我不知道如何获得有关到达它的结尾的通知,而不是打破MVVM范例。 我怎样才能做到这一点?

我唯一需要知道的是如何保留MVVM功能和约束,并在集合被枚举到最后时获得通知。

感谢。

修改

我一直在挖掘一下,我担心这不是一个简单的解决方案。我认为唯一的可能性是实现自定义集合,它将实现ICollection和INotifyCollectionChanged。但我不知道ListBox和其他ItemsSource启用控件的内部机制是如何工作的,所以我不知道如何实现延迟加载。

WP控件的主要提取机制是利用ItemsSource IEnumerable接口吗?还是使用索引器方法?它如何称为计数?它取决于计数还是可以在它的生命周期中进行更改(以及哪些调用?我认为并非所有调用都可以更改Count,然后调用NotifyCollectionChanged)。

有文件吗?或者有任何可用的实现吗?

2 个答案:

答案 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