gpt4 book ai didi

.net - ViewModel 和无尽的集合

转载 作者:行者123 更新时间:2023-12-03 10:24:01 27 4
gpt4 key购买 nike

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

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

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

谢谢。

编辑

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

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

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

最佳答案

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

实现此目的的一种方法是从 IList 继承并监视 this[int index]属性(property)。

例如:

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 模式。当当前请求的项目是靠近列表末尾的项目时,这就是您开始加载更多 block 的队列......

请注意,您需要从 IList 派生也因为对于虚拟化,WPF 似乎检查 IList (无泛型)和 IList<T>并非源自 IList .长话短说,如果你不是来自 IList 同样,将为列表中的每个项目调用索引器。

关于.net - ViewModel 和无尽的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13269037/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com