wpf listview 按需加载
时间: 2023-08-27 18:07:11 浏览: 155
WPF ListView 控件可以通过绑定数据源来显示数据,但是当数据量很大时,一次性加载所有数据会导致性能问题。为了解决这个问题,我们可以实现按需加载数据的功能。
以下是一种实现按需加载的方法:
1. 创建一个继承自 ObservableCollection 类的子类,用于存储所有数据。
```csharp
public class LazyLoadingCollection<T> : ObservableCollection<T>
{
public int PageSize { get; set; }
public int PageIndex { get; set; }
public bool HasMoreItems { get; set; }
private readonly Func<int, int, Task<IEnumerable<T>>> _loadDataFunc;
public LazyLoadingCollection(Func<int, int, Task<IEnumerable<T>>> loadDataFunc)
{
_loadDataFunc = loadDataFunc;
PageIndex = 0;
PageSize = 20;
HasMoreItems = true;
}
public async Task LoadMoreItemsAsync()
{
var data = await _loadDataFunc(PageIndex, PageSize);
if (data != null)
{
foreach (var item in data)
{
Add(item);
}
PageIndex++;
}
else
{
HasMoreItems = false;
}
}
}
```
2. 在 XAML 中定义 ListView 控件,并绑定到 LazyLoadingCollection 类的实例。
```xaml
<ListView ItemsSource="{Binding Items}">
<ListView.ItemTemplate>
<DataTemplate>
<!-- 定义每个项的模板 -->
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
```
3. 在 ViewModel 中创建 LazyLoadingCollection 类的实例,并将其绑定到 ListView 控件。
```csharp
public class MyViewModel
{
public LazyLoadingCollection<MyData> Items { get; set; }
public MyViewModel()
{
Items = new LazyLoadingCollection<MyData>(LoadData);
}
private async Task<IEnumerable<MyData>> LoadData(int pageIndex, int pageSize)
{
// 从数据库中获取数据
// SELECT * FROM MyTable ORDER BY Id OFFSET pageIndex * pageSize ROWS FETCH NEXT pageSize ROWS ONLY
}
}
```
4. 在 ListView 控件的滚动事件中,判断是否需要加载更多数据并调用 LoadMoreItemsAsync 方法。
```csharp
private async void ListView_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
var listView = (ListView)sender;
var scrollViewer = e.OriginalSource as ScrollViewer;
if (scrollViewer != null && scrollViewer.ScrollableHeight > 0 && scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight)
{
if (viewModel.Items.HasMoreItems)
{
await viewModel.Items.LoadMoreItemsAsync();
}
}
}
```
通过实现按需加载功能,可以提升 ListView 控件的性能和用户体验。
阅读全文