Sto provando a creare un'app di riferimento Metro Win8 per gli elenchi virtualizzati. Nel fare alcune (molto scarse) letture, ho trovato che il modo consigliato di supportarlo è attraverso l'interfaccia ISupportIncrementalLoading
.ISupportIncrementalLoading si attiva solo una volta
Sto riscontrando un problema con la mia app di riferimento, in cui il metodo LoadMoreItemsAsync
viene chiamato una volta, ma non viene chiamato di nuovo, anche se la proprietà HasmoreItems
è codificata per restituire True.
Ciò che il codice seguente dovrebbe fare è caricare 40 articoli, quindi caricare il numero "x" in un momento successivo. Quello che succede è che carica i primi 40 elementi, quindi viene richiesto di caricarne altri 42, quindi non viene mai chiesto di caricarlo di nuovo.
Ecco le porzioni rilevanti del mio codice:
XAML
<Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
<ListView ItemsSource="{Binding Items}" Width="800" HorizontalAlignment="Left" Margin="12">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" Foreground="White"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
ViewModel e Supporto Classi:
public class MainViewModel : ViewModelBase
{
public MyIncrementalCollection Items { get; set; }
public MainViewModel()
{
Items = new MyIncrementalCollection();
for (int i = 0; i < 40; i++)
{
Items.Add(new MyData {Title = string.Format("Item: {0}", i)});
}
}
}
public class MyData
{
public string Title { get; set; }
}
public class MyIncrementalCollection : ObservableCollection<MyData>, ISupportIncrementalLoading
{
public bool HasMoreItems
{
get
{
return true;
}
}
public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
{
return
(IAsyncOperation<LoadMoreItemsResult>)
AsyncInfo.Run((System.Threading.CancellationToken ct) => LoadDataAsync(count));
}
private async Task<LoadMoreItemsResult> LoadDataAsync(uint count)
{
for (int i = 0; i < count; i++)
{
this.Add(new MyData { Title = string.Format("Item: {0}, {1}", i, System.DateTime.Now) });
}
var ret = new LoadMoreItemsResult {Count = count};
return ret;
}
}
}
Beh, manda. Che funzioni. Mi chiedo se sistemeranno questo nella RC ... – Robaticus