1

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

我已将 ListBox 绑定到 ObservableCollection,但我不知道如何在到达它的末尾时收到通知,但又不会破坏 MVVM 范式。我怎样才能做到这一点?

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

谢谢。

编辑

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

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

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

4

2 回答 2

2

因为这应该支持 MVVM,所以我不会将事件绑定到列表框的一部分,而是作为集合本身的一部分。当请求的索引接近列表末尾时,您应该尝试添加更多块。

实现此目的的一种方法是从 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需要从. 长话短说,如果您也没有从中派生 ,则将为列表中的每个项目调用索引器。IListIList<T>IListIList

于 2012-11-07T11:53:06.367 回答
1

我找到了一个不错的解决方案,它不会破坏 MVVM,但为这个问题提供了非常优雅的解决方案(乍一看,我还没有正确调查它。)看看http://danielvaughan.orpius.com/post /Scroll-Based-Data-Loading-in-Windows-Phone-7.aspx

还有我忽略的stackoverflow主题。到达最后一项后查看WP7 Auto Grow ListBox 。

于 2012-11-07T14:32:31.430 回答