ISupportIncrementalLoad只触发一次
本文关键字:一次 ISupportIncrementalLoad | 更新日期: 2023-09-27 18:33:53
我正在尝试为虚拟化列表创建一个 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>
视图模型和支持类:
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;
}
}
}
问题是你的方法 LoadDataAsync(uint count) 缺少 await 运算符,因此它将同步运行。我也有类似的问题。当我收到一些库文件夹时,数据虚拟化对我有用,但当我尝试加载自定义项目集合时,它只触发一次。
我使用了一种解决方法,不是很优雅,但它有效。修改您的 LoadDataAsync 方法,如下所示:
private async Task<LoadMoreItemsResult> LoadDataAsync(uint count)
{
Task task = Task.Delay( 1 );
await task;
for (int i = 0; i < count; i++)
{
Add(new MyData { Title = string.Format("Item: {0}, {1}", i, System.DateTime.Now) });
}
return new LoadMoreItemsResult {Count = count};
}
UI 只会在它觉得需要的时候调用 HasMoreItems。如果它有足够的项目来填充当前可见的区域,则它不会检查更多项目。如果您开始向列表末尾滚动,那么它将检查是否有更多项目(以及是否有调用 LoadMoreItemsAsync)。
另外,您可以在LoadMoreItemsAsync中简化代码以
public IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
{
return LoadDataAsync(count).AsAsyncOperation();
}