即使启用了虚拟化,WPF中的ItemsControl也会生成所有项

本文关键字:ItemsControl 中的 启用 虚拟化 WPF | 更新日期: 2023-09-27 18:01:50

我有一个继承自ItemsControl的类和一个继承自VirtualizedPanel的VirtualizedPanel,我创建了模板,以便我的控件在ScrollViewer中保留itempresententer,并启用所有的虚拟化属性以及CanContentScroll。

问题是我在后端使用数据虚拟化,所以我没有所有的集合在内存和WPF中,当ItemsControl被加载时,它调用GetEnumerator(),所以它试图去所有的集合。在Silverlight中,这种情况不会发生,ItemsControl只是使用我的集合的索引器调用可见的项目,它实现了IList。

是否有办法使ItemsControl在WPF只是使用索引器,而不是试图通过IEnumerable加载所有的集合?

即使启用了虚拟化,WPF中的ItemsControl也会生成所有项

虚拟化在WPF....中默认只应用于ListBox和ListView

当我试图为我的控件实现自定义集合时,也遇到了同样的问题,继承自ItemsControl。我的集合只实现了IList,当我把它放在ItemsSource中时,除了索引器之外,只调用了GetEnumerator方法。当我添加了illist的继承后,它开始调用indexer。

用法示例:

class MyClass : IList<T>, IList
{
  ...
        object IList.this[int index]
        {
            get { return this[index]; }
            set { throw new NotSupportedException(); }
        }
        public int this[int index]
        {
            get { return items[i]; }
            set { throw new NotSupportedException(); }
        }
        public IEnumerator<T> GetEnumerator()
        {
            for (int i = 0; i < count; i++)
            {
                yield return items[i];
            }
        }
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
  ...
}