Вы также можете иметь виртуализацию данных, просто используйте ListCollectionView:
public class MyCollection<T> : ListCollectionView
{
public MyCollection(List<T> list)
: base(list)
{
}
public override object GetItemAt(int index)
{
Debug.WriteLine(index);
return base.GetItemAt(index);
}
}
Тогда будет запрошен только видимый элемент.(вы также можете реализовать собственный CollectionView, там многое можно переопределить)
Редактировать: Вы также можете реализовать IList, WPF, кажется, проверяет IList, а IList не является IList.