动态更改ListView的数据源

本文关键字:数据源 ListView 动态 | 更新日期: 2023-09-27 18:21:35

我有一个ListView和数据源,它从Internet填充。一旦它被填充,它应该保持静态,除非用户发出新的http请求。现在我有这样的东西:

class MyDataItem {
  public int Field1 { get; set; }
  public string Field2 { get; set; }
}
class Window1: Window {
  private List<MyDataItem> dataSource = new ...
  void sendHttpRequest(...) {
    dataSource = getFromInternet();
    myListView.ItemsSource = dataSource ;
  }
}

然后说,我有一个复选框。当我点击它时,我想通过一些过滤器来过滤数据。

//.........
// the checkbox is checked
var filterDataSource = dataSource.Where(....)

如何使我的ListView将其数据源更新为filterDataSource?然后,当再次取消选中复选框时,我将如何使其显示初始数据源?

动态更改ListView的数据源

这里有一些代码可以帮助您。请注意,这并没有经过测试或编译,但它可以为您提供一些关于如何处理您的案例的提示。诀窍是使用CollectionViewSource来过滤数据。

class Window1: Window {
    private readonly ObservableCollection<MyDataItem> _children;
    private readonly CollectionViewSource _viewSource;
    public Window1()
    {
        // ... 
        _children = new ObservableCollection<MyDataItem>();
        _viewSource = new CollectionViewSource
        {
            Source = _children
        };
        myListView.ItemsSource = _viewSource;
        // ...
    }
    // This method needs to be called when your checkbox state is modified.
    // "filter = null" means no filter
    public void ApplyFilter(Func<MyDataItem, bool> filter)
    {
        if (_viewSource.View.CanFilter)
        {
            _viewSource.View.Filter = (filter == null) ? (o => true): (o => filter((MyDataItem) o));
        }
    }