我有一个继承自ItemsControl的类,还有一个继承自VirtualizedStack Panel的VirtualizedPanel,我创建了模板,以便my Controls在ScrollViewer中保存Itemspresenter并启用所有Vitualizing Properties以及CanContentScroll。
问题是我在后端使用DataVirtualization所以我没有内存和WPF中的所有集合,当ItemsControl加载时它调用GetEnumerator()所以它试图遍布集合。在Silverlight中没有发生这种情况,ItemsControl只使用我的Collection的Indexer调用可见项,它实现了IList。
有没有办法让WPF中的ItemsControl只使用索引器而不是尝试通过IEnumerable加载所有集合?
答案 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();
}
...
}