CollectionViewSource не обновляет интерфейс - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь реализовать фильтрацию и подкачку на ListView.Мне удалось выполнить фильтрацию, но я заметил, что пользовательский интерфейс не обновляется при добавлении / удалении элементов из коллекции.

Вот мои настройки: XAML:

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

Сторона VM:

  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) безуспешно, также попытался RaisePropertyChanged на UsersCollection, снова без удачи,Пользовательский интерфейс остается таким же, как при первом создании.

PS Я добавляю записи в файловую БД (LiteDB), а затем мне нужно извлечь их из БД и обновить пользовательский интерфейс.Это работало до тех пор, пока я не начал использовать 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;
    }

и по методу добавления я только что использовал эти строки, и это сработало:

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

        _usersCollection.View.Refresh();

1 Ответ

0 голосов
/ 04 октября 2018

Ваша исходная коллекция представляет собой простой список:

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

По этой причине вы не будете получать обновления пользовательского интерфейса.Свойство UsersCollection будет запрошено CollectionViewSource один раз, поэтому экземпляр CollectionViewSource будет работать только с тем единственным списком элементов, которые были получены при инициализации.

Если вы извлечете документация , вы увидите следующее:

Если в исходной коллекции реализован интерфейс INotifyCollectionChanged, изменения, вызванные событием CollectionChanged, распространяются на представления.

В исходной коллекции необходимо реализовать INotifyCollectionChanged.Например, ObservableCollection<T>.

Таким образом, решение состоит в том, что вместо использования динамически создаваемых списков вы должны использовать ObservableCollection<User> в качестве источника для CollectionViewSource.

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

Кроме того, вам нужно будет изменить свой код, чтобы этот usersObservableCollection заполнялся элементами из вашей базы данных.

...