CollectionViewSource不会更新UI

时间:2018-10-04 13:10:53

标签: c# wpf listview collectionviewsource icollectionview

我正在尝试对ListView进行过滤和分页。我设法进行了过滤,但是观察到在添加/删除集合中的项目时UI没有得到更新。

这是我的设置: XAML:

   <ListView
           ItemsSource="{Binding SourceCollection, UpdateSourceTrigger=Explicit}"
           ScrollViewer.HorizontalScrollBarVisibility="Hidden"
           ScrollViewer.VerticalScrollBarVisibility="Auto"/>

虚拟机端:

  private CollectionViewSource _usersCollection;

CTOR

  _usersCollection = new CollectionViewSource {Source = UsersCollection};
  _usersCollection.Filter += usersCollection_Filter;

道具:

  public ICollectionView SourceCollection => _usersCollection.View;
  public List<User> UsersCollection => LiteDbHelper.GetAllUsers();

然后,当我添加新项目时,我尝试Refresh()集合(SourceCollection_usersCollection都没有运气,也尝试对{{ 1}},再次没有运气。用户界面保持与第一次创建时相同。

P.S。我将记录添加到文件数据库(LiteDB),然后需要从数据库检索它们并更新UI。直到我开始使用RaisePropertyChanged

有任何提示吗?

更新: 我设法通过以下代码解决了这个问题:

更改了用于填充UsersCollection的属性:

ICollectionView

在添加方法上,我只使用了以下几行,就可以了:

CollectionViewSource

1 个答案:

答案 0 :(得分:0)

您的来源集合是一个简单的列表:

List<User> UsersCollection => LiteDbHelper.GetAllUsers();
_usersCollection = new CollectionViewSource { Source = UsersCollection };

这是您不会获得任何UI更新的原因。 UsersCollection将一次查询CollectionViewSource属性,因此CollectionViewSource的实例仅适用于初始化时检索到的单个项目列表。

如果您检出the documentation,将会看到以下内容:

  

如果源集合实现了INotifyCollectionChanged接口,则CollectionChanged事件引发的更改将传播到视图。

源集合需要实现INotifyCollectionChanged。那是例如ObservableCollection<T>

因此解决方案是:应该使用ObservableCollection<User>作为CollectionViewSource的源,而不是使用动态创建的列表。

ObservableCollection<User> usersObservableCollection = new ObservableCollection<User>();
_usersCollection = new CollectionViewSource { Source = usersObservableCollection };

此外,您将需要更改代码,以便此usersObservableCollection由数据库中的项目填充。