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

时间:2011-07-11 17:26:50

标签: c# wpf silverlight

我有一个继承自ItemsControl的类,还有一个继承自VirtualizedStack Panel的VirtualizedPanel,我创建了模板,以便my Controls在ScrollViewer中保存Itemspresenter并启用所有Vitualizing Properties以及CanContentScroll。

问题是我在后端使用DataVirtualization所以我没有内存和WPF中的所有集合,当ItemsControl加载时它调用GetEnumerator()所以它试图遍布集合。在Silverlight中没有发生这种情况,ItemsControl只使用我的Collection的Indexer调用可见项,它实现了IList。

有没有办法让WPF中的ItemsControl只使用索引器而不是尝试通过IEnumerable加载所有集合?

2 个答案:

答案 0 :(得分:1)

虚拟化仅在WPF中默认应用于ListBox和ListView ....尝试使用其中一个控件...

答案 1 :(得分:1)

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

使用示例:

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();
        }
  ...
}