Ho appena pubblicato un paio di post di blog (Part 1, Part 2) che danno la mia soluzione a questo problema. Ho anche pubblicato a sample su GitHub che implementa la mia versione del concetto di VirtualCollection (non so come questo si paragoni al controllo di Infragistics, perché non l'ho usato).
Per mostrare quanto sia facile da usare, ecco alcuni frammenti dall'esempio. In primo luogo, ecco come si usa VirtualCollection, la classe che coordina il recupero dei dati:
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();
}
}
In XAML è sufficiente associare la proprietà Items
alla ItemsSource
proprietà di un ListBox
o DataGrid
Per ogni fonte di dati è necessario implementare una VirtualCollectionSource. Ecco quello che i due metodi principali di NetflixTitlesSource assomigliano:
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
}
}
fonte
2012-08-13 09:31:00
Aggiornamento: Dal momento che l'argomento ritorna Attualmente sto indagando controlli 3rd-party. L'Infragistics "VirtualCollection" sembra gestire questo nel modo migliore e può essere associato a DomainServices - roba carina –