Создать представление представления в WPF - PullRequest
1 голос
/ 26 февраля 2010

ОК, поэтому мне нужно создать ICollectionView из существующего ICollectionView. Идея состоит в том, что я могу использовать любые фильтры / группировки / сортировки, установленные в существующем представлении, а затем создавать другие представления из этого «базового» представления, по сути «наслоения» или агрегирования моих фильтров и т. Д.

Мне нужно, чтобы конечный вид обновлял свои элементы «автоматически», когда обновляется исходная коллекция (ObservableCollection<T>) и когда обновляется элемент данных - как при вызове метода Refresh(). Мне нужно избегать вызова Refresh для всех представлений, потому что мы не знаем всех представлений между исходной коллекцией и конечным представлением, а Refresh() мучительно медленен.

Мы стараемся избегать использования собственных классов представлений - мы бы предпочли (настоятельно) использовать то, что уже существует в библиотеке .net.

Обновление

У нас есть звонок в Microsoft по этому поводу. Я знаю, что другие имеют ту же проблему, как минимум, что то, что Доктор. WPF говорит мне .

1 Ответ

1 голос
/ 11 марта 2010

ОК, так что мы закончили свою собственную коллекцию и просмотр.

Наша коллекция основана на ObservableCollection, которая присоединяется к событию PropertyChanged каждого элемента в коллекции. У нас есть событие, которое мы вызываем всякий раз, когда свойство изменяется, таким образом другие классы и / или представления могут перехватить это и обработать его, как они считают нужным.

Затем мы создали наш собственный ICollectionView, основанный на ListCollectionView. Представление отслеживает событие CollectionItemChanged из коллекции и просто вызывает (если элемент в коллекции IEditableObject) IEditableList.EditItem (...) и IEditableList.CommitItem (...)

этот Edit () и затем CommitItem () заставляют представление обновляться без фактического вызова Refresh ()

Это полностью "haxor", но работает до того дня, когда MS сделает что-то для нас, бедных разработчиков, чтобы это исправить.

...