he acaba de publicar un par de entradas de blog (Part 1, Part 2) que dan mi solución a este problema. También he publicado a sample en GitHub que implementa mi propia opinión sobre el concepto de Colección Virtual (no sé cómo se compara con el control de Infragistics, porque no lo he usado).
Para mostrar lo fácil que es utilizar, aquí hay algunos fragmentos de la muestra. En primer lugar, aquí es cómo se utiliza VirtualCollection, la clase que coordina ir a buscar los datos:
public class MainViewModel : ViewModel
{
private NetflixTitlesSource _source;
public VirtualCollection<Title> Items { get; private set; }
public MainViewModel()
{
_source = new NetflixTitlesSource();
Items = new VirtualCollection<Title>(_source, pageSize: 20, cachedPages: 5);
}
protected override void OnViewLoaded()
{
Items.Refresh();
}
}
En XAML simplemente enlazar la propiedad Items
a la propiedad ItemsSource
de un ListBox
o DataGrid
Para cada fuente de datos que deben implementar un VirtualCollectionSource. Esto es lo que los dos métodos principales de NetflixTitlesSource se parecen:
public class NetflixTitlesSource : VirtualCollectionSource<Title>
{
protected override Task<int> GetCount()
{
return GetQueryResults(0, 1, null)
.ContinueWith(t => (int)t.Result.TotalCount, TaskContinuationOptions.ExecuteSynchronously);
}
protected override Task<IList<Title>> GetPageAsyncOverride(int start, int pageSize, IList<SortDescription> sortDescriptions)
{
return GetQueryResults(start, pageSize, sortDescriptions)
.ContinueWith(t => (IList<Title>)((IEnumerable<Title>)t.Result).ToList(), TaskContinuationOptions.ExecuteSynchronously);
}
private Task<QueryOperationResponse<Title>> GetQueryResults(int start, int pageSize, IList<SortDescription> sortDescriptions)
{
// code to query the Netflix OData API
}
}
Actualización: Ya que el tema se vuelve Actualmente estoy investigando controles tercera partes. The Infragistics "VirtualCollection" parece manejar esto de la mejor manera y puede estar vinculado a DomainServices - nice stuff –