我正在尝试对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
答案 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
由数据库中的项目填充。