|
Можно ли обновить ICollectionView без общего Refrash
|
|||
---|---|---|---|
#18+
Всем привет, у меня есть коллекция sz_list, для нее создано ICollectionView, и все это привязано к ItemControl. Есть необходимость менять (удалять/добавлять) элементы в sz_list, соответственно приходится рефрешить ICollectionView, чтобы UI обновился. Ввиду того что ItemControl графически непростой по структуре при рефреше прорисовывается весь ItemControl с нуля и при большом количестве элементов это может просадить FPS и графон начнет тормозить. Соответственно есть ли возможность добавления или удаления элементов из коллекции, но чтобы весь ICollectionView не пересоздавать (в графическом плане). Есть ли какой либо вариант кроме переписывания Refresh? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2017, 20:01 |
|
Можно ли обновить ICollectionView без общего Refrash
|
|||
---|---|---|---|
#18+
конечно, можно даже сделать так, что они будут появляться в представлении коллекции, но при этом сама коллекция будет пустая. начнем с того, что ICollectionView синхронизируется с основной коллекцией через интерфейс INotifyCollectionChanged который предоставляет события CollectionChanged. Добавление\вставка\удаление\перемещение\замена элементов может быть только по 1 за 1 изменение. Если источник такой интерфейс не поддерживает, можно либо дергать обработчик события с нужными параметрами, либо методы которые он вызывает. И эффект будет такой же. + еще есть такая фишка, что если вы передаете IEnumerable в ItemsSource элемент ItemsControl, то для него будет браться представление по умолчанию CollectionViewSource.GetDefaultView(), но если в ItemsSource передавать ICollectionView, то будет использовать непосредственно он. Практически для все коллекций\перечислений используется представление ListCollectionView, от него можно унаследоваться и передавть в ItemsSource непосредственно его. Завтра буду на работе, могу накидать пример, если сильно нужно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2017, 22:39 |
|
Можно ли обновить ICollectionView без общего Refrash
|
|||
---|---|---|---|
#18+
ну и как я уже написал, то, что вы возвращаете из медели представления ICollectionView в видел CollectionViewSource.GetDefaultView, это бесполезная хрень, потому как после того как вы зададите коллекцию sz_list в свойство ItemsSource, элемент управления сам получит представление по умолчанию :) и еще 1 момент важно помнить CollectionViewSource.GetDefaultView в разных потоках будет возвращать разные представления. одно и тоже представление коллекции в разных потоках использовать нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2017, 22:43 |
|
Можно ли обновить ICollectionView без общего Refrash
|
|||
---|---|---|---|
#18+
Roman Mejtes, да дайте пожалуйста пример. А ICollectionView нужно использовать вместо прямого биндинга к коллекции, когда нужно применять сортировку, фильтрацию, группировку или еще в каких-либо случаях? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2017, 13:48 |
|
Можно ли обновить ICollectionView без общего Refrash
|
|||
---|---|---|---|
#18+
vb_subRoman Mejtes, да дайте пожалуйста пример. А ICollectionView нужно использовать вместо прямого биндинга к коллекции, когда нужно применять сортировку, фильтрацию, группировку или еще в каких-либо случаях? я использую ICollectionView для отображения иерархий в контролах типа ItemsControl (ListBox, ComboBox) так же ICollectionView синхронизирует CurrentItem этих контролов. То есть можно управлять текущим выбранным элементом. Если можно так сказать. Группировка дерьмо полное, лучше делать иерархические списки разного типа. Для разных типов задать разные шаблоны данных. Nfr Так же через ICollectionView в отображаемую коллекцию элементов можно добавлять такие как NewItemPlaceholder или просто элемент коллекции заданного типа по умолчанию, для добавления коллекции. Ведь вы и из представления можете добавить элемент в коллекцию, при условии что исходная коллекция имеет типа IList или ICollection и прочие полезные функции, через этот замечательный интерфейс можно реализовать. Используйте ListCollectionView как основу, нет ни какой необходимости реализовывать этот класс с нуля. Для DataTable классов есть отдельные представление. Думаю на этом всё, я решил завтра поработать :) так что прошу прощения :) дома не стоит студия и ставить мне её честно говоря не очень хочется :) В прямом биндинге нет особого смысла, так как существует представление по умолчанию! но, если вы биндите 1 и туже коллекцию к разным элементам списочного типа, то сортировка, группировка и весь функционал про который написано выше будет дублироваться, то есть фильтрация будет применяться на все элементы управления. Имеет смысл в данном случае создавать свое представление коллекции и передавать его в ItemsSource (биндить). Тогда в каждом из контролов всё будет раздельно =) Для отключения синхронизации CurrentItem можно использовать свойство Selector.IsSynchronizedWithCurrentItem, оно доступно для всяких combobox'ов, listitem'ов и прочего наследованно от класса селектора. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2017, 17:33 |
|
Можно ли обновить ICollectionView без общего Refrash
|
|||
---|---|---|---|
#18+
vb_sub Код: c# 1. 2. 3.
Я не вижу добавляемого элемента, есть элемент, у которого меняется свойство. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2017, 12:41 |
|
Можно ли обновить ICollectionView без общего Refrash
|
|||
---|---|---|---|
#18+
refregvb_sub Код: c# 1. 2. 3.
Я не вижу добавляемого элемента, есть элемент, у которого меняется свойство. есть такое, если меняется через свойство и реализовано через фильтрацию, то только Refresh. По другому не работает. Но можно написать прослойку которая будет фильтровать так, что реализация будет через Add\Remove\Insert и т.д. =) https://drive.google.com/open?id=0BxmtlsFg8WIsdUFmVG1Od3I3S28 пример, как для List<T> сделать добавление\удаление без Refresh. Если интересны примеры и иерархиями могу тоже пример скинуть, где то валяется Это пример с коленки ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2017, 12:56 |
|
Можно ли обновить ICollectionView без общего Refrash
|
|||
---|---|---|---|
#18+
vb_subЕсть необходимость менять (удалять/добавлять) элементы в sz_list, соответственно приходится рефрешить ну дак заявленный вопрос выше не относится к этому коду: vb_sub Код: c# 1. 2.
это действительно, как сказано выше - не добавление\удаление элеменов. А на update элементов событие выше и интерфейс не реагирует. Я так понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2017, 14:29 |
|
Можно ли обновить ICollectionView без общего Refrash
|
|||
---|---|---|---|
#18+
Код: c# 1. 2.
Потом нужно дернуть что-то типа: Код: c# 1.
Не проверял. sz_list - должна быть наблюдаемой коллекцией. По идее, будет обновлена только одна запись - как я понял именно это цель... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2017, 15:11 |
|
Можно ли обновить ICollectionView без общего Refrash
|
|||
---|---|---|---|
#18+
refreg, Наверно да. Это логично. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2017, 15:16 |
|
|
start [/forum/topic.php?fid=21&fpage=7&tid=1440479]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
85ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
others: | 248ms |
total: | 415ms |
0 / 0 |