Как применить фильтр к PagedCollectionView, но предотвратить запуск события CollectionChanged при редактировании?
У меня есть приложение Silverlight, где DataForm
связывает на PagedCollectionView
содержащие объекты, которые реализуют IEditableObject
, Всякий раз, когда пользователь редактирует объект, используя DataForm, CollectionChanged
событие в коллекции запускается дважды, сначала с помощью действия Удалить, а затем с действием Добавить.
Это не то, что я хочу. Я просто хочу отредактировать объект в коллекции, не вызывая событие CollectionChanged.
Когда я пытаюсь воспроизвести эту проблему в простом тестовом приложении, она ведет себя так, как мне хотелось бы (то есть не вызывает событие), и я не могу понять, что вызывает разницу в поведении моего основного приложения и тестового приложения.
Кто-нибудь знает, когда DataForm решает изменить коллекцию, а не просто редактировать объект? Что вызывает эту разницу?
Обновить
Эти статьи заставили меня задуматься о фильтрах, и, как оказалось, применение фильтра к PagedCollectionView имеет значение. С фильтром: действие редактирования пользователем приводит к удалению / добавлению из коллекции, без фильтра: без изменения коллекции, просто редактирование объекта.
Итак, теперь возникает вопрос: почему фильтр вызывает поведение Remove/Add (даже если фильтр просто "возвращает true", то есть разрешает все записи в коллекции) и как это предотвратить?
1 ответ
Похоже, я наконец-то нашел ответ. Решение состоит в том, чтобы не слушать событие CollectionChanged PagedCollectionView
, но для прослушивания события CollectionChangedPagedCollectionView.SourceCollection
, В моем случае это ObservableCollection, поэтому у него есть событие CollectionChanged.
Чтобы понять это, мне нужно было понять, что PagedCollectionView
действительно следует рассматривать как представление, охватывающее коллекцию, а не просто как другой тип коллекции, который я могу использовать. Глядя на это таким образом, совершенно очевидно, что вы хотите искать изменения в базовой коллекции, а не в представлении. После того, как вы это выяснили, все это становится довольно очевидным:-)