我正在尝试创建一个Win8 Metro参考应用程序,用于虚拟列表。经过一些(非常稀疏的)阅读,我发现支持此功能的推荐方法是通过ISupportIncrementalLoading
接口。
我的参考应用程序存在问题,其中LoadMoreItemsAsync
方法被调用了一次,但是不再次调用,尽管我的HasmoreItems
属性硬编码为返回True。
以下代码应该加载40个项目,然后以后每次加载“x”个项目。实际情况是它加载了前40个项目,然后提示要加载42个以上,然后再也没有被要求去加载。
以下是我的代码中相关的部分:
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 and Support Classes:
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;
}
}
}
<Page>
标签。在我的异步加载操作中,我是否需要执行任何特定操作来告诉ListView我已经完成加载,以便它不会再次触发?我认为返回LoadMoreItemsResult应该已经足够了。 - Robaticus