【问题标题】:CollectionViewSource doesn't update the UICollectionViewSource 不更新 UI
【发布时间】:2018-10-04 13:10:52
【问题描述】:

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

这是我的设置: XAML:

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

虚拟机端:

  private CollectionViewSource _usersCollection;

导演

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

道具:

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

然后,当我添加新项目时,我尝试Refresh() 集合(SourceCollection_usersCollection)没有运气,还尝试在UsersCollectionRaisePropertyChanged,再次没有运气。 UI 与第一次创建时保持一致。

附:我正在将记录添加到文件数据库 (LiteDB),然后我需要从数据库中检索它们并更新 UI。这一直有效,直到我开始使用ICollectionView

有什么提示吗?

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

更改了提供 CollectionViewSource 的属性:

 private ObservableCollection<User> _usersCollectionDB = new ObservableCollection<User>();
    public ObservableCollection<User> UsersCollection
    {
        get
        {
            if (_usersCollectionDB.Count == 0)
            {
                var allUsers = LiteDbHelper.GetAllUsers();
                _usersCollectionDB.AddRange(allUsers);
                return _usersCollectionDB;
            }

            return _usersCollectionDB;

        }
        set => _usersCollectionDB = value;
    }

在 add 方法上,我刚刚使用了这些行并且它起作用了:

        var allUsers = LiteDbHelper.GetAllUsers();
        _usersCollectionDB.Clear();
        _usersCollectionDB.AddRange(allUsers);

        _usersCollection.View.Refresh();

【问题讨论】:

  • 如何检索记录并更新源集合?
  • 有了这个:LiteDbHelper.GetAllUsers,一开始我只提升了属性来获取新值,但现在使用 ICollectionView 它不再起作用了
  • 您需要重置 Source 属性。请发布您的代码。
  • 我清理了我的虚拟机以便只包含这个问题的内容:pastebin.com/vpi7VqVS AddUserMethod - 当我向数据库添加新用户时调用
  • 您还没有发布任何 AddUserMethod。请在此处发布代码的相关部分,而不是引用一些外部链接。

标签: c# wpf listview collectionviewsource icollectionview


【解决方案1】:

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

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

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

如果您查看the documentation,您将看到以下内容:

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

源集合需要实现INotifyCollectionChanged。那是例如一个ObservableCollection&lt;T&gt;

因此解决方案是:您应该使用ObservableCollection&lt;User&gt; 作为CollectionViewSource 的来源,而不是使用动态创建的列表。

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

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

【讨论】:

  • 我将 Source 修改为 ObservableCollection 但仍然无法正常工作,我什至强制提高 usersObservableCollection 但 UI 保持不变。
猜你喜欢
  • 2013-09-14
  • 2017-02-17
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 2011-08-11
  • 2017-05-21
相关资源
最近更新 更多