powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Можно ли обновить ICollectionView без общего Refrash
11 сообщений из 11, страница 1 из 1
Можно ли обновить ICollectionView без общего Refrash
    #39543528
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, у меня есть коллекция 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.
        private ICollectionView _added_personSz;

        public ICollectionView added_personSz
        {
            get
            {
                ICollectionView temp = CollectionViewSource.GetDefaultView(sz_list);
                if (temp != null)
                {
                    Application.Current.Dispatcher.Invoke(() => temp.Filter =
                    new  Predicate<object>(
                     x =>
                     ((PersonSz)x).must_show
                     )
                    );
                }
                return temp;
            }
            set
            {
                if (value != _added_personSz)
                    _added_personSz = value;
            }
        }


//добавляем элемент
            sz_list.Where(p1 => p1.prsn.ID == p.ID).First().must_show = p.IsShown;
            added_personSz.Refresh(); // без рефреша UI не показывает, что элемент добавлен
...
Рейтинг: 0 / 0
Можно ли обновить ICollectionView без общего Refrash
    #39543569
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно, можно даже сделать так, что они будут появляться в представлении коллекции, но при этом сама коллекция будет пустая.
начнем с того, что ICollectionView синхронизируется с основной коллекцией через интерфейс INotifyCollectionChanged который предоставляет события CollectionChanged.
Добавление\вставка\удаление\перемещение\замена элементов может быть только по 1 за 1 изменение.
Если источник такой интерфейс не поддерживает, можно либо дергать обработчик события с нужными параметрами, либо методы которые он вызывает. И эффект будет такой же.
+ еще есть такая фишка, что если вы передаете IEnumerable в ItemsSource элемент ItemsControl, то для него будет браться представление по умолчанию CollectionViewSource.GetDefaultView(), но если в ItemsSource передавать ICollectionView, то будет использовать непосредственно он.
Практически для все коллекций\перечислений используется представление ListCollectionView, от него можно унаследоваться и передавть в ItemsSource непосредственно его.
Завтра буду на работе, могу накидать пример, если сильно нужно :)
...
Рейтинг: 0 / 0
Можно ли обновить ICollectionView без общего Refrash
    #39543572
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и как я уже написал, то, что вы возвращаете из медели представления ICollectionView в видел CollectionViewSource.GetDefaultView, это бесполезная хрень, потому как после того как вы зададите коллекцию sz_list в свойство ItemsSource, элемент управления сам получит представление по умолчанию :)

и еще 1 момент важно помнить CollectionViewSource.GetDefaultView в разных потоках будет возвращать разные представления. одно и тоже представление коллекции в разных потоках использовать нельзя.
...
Рейтинг: 0 / 0
Можно ли обновить ICollectionView без общего Refrash
    #39543674
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
да дайте пожалуйста пример. А ICollectionView нужно использовать вместо прямого биндинга к коллекции, когда нужно применять сортировку, фильтрацию, группировку или еще в каких-либо случаях?
...
Рейтинг: 0 / 0
Можно ли обновить ICollectionView без общего Refrash
    #39543733
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subRoman Mejtes,
да дайте пожалуйста пример. А ICollectionView нужно использовать вместо прямого биндинга к коллекции, когда нужно применять сортировку, фильтрацию, группировку или еще в каких-либо случаях?
я использую ICollectionView для отображения иерархий в контролах типа ItemsControl (ListBox, ComboBox)
так же ICollectionView синхронизирует CurrentItem этих контролов. То есть можно управлять текущим выбранным элементом. Если можно так сказать. Группировка дерьмо полное, лучше делать иерархические списки разного типа. Для разных типов задать разные шаблоны данных. Nfr Так же через ICollectionView в отображаемую коллекцию элементов можно добавлять такие как NewItemPlaceholder или просто элемент коллекции заданного типа по умолчанию, для добавления коллекции. Ведь вы и из представления можете добавить элемент в коллекцию, при условии что исходная коллекция имеет типа IList или ICollection и прочие полезные функции, через этот замечательный интерфейс можно реализовать.
Используйте ListCollectionView как основу, нет ни какой необходимости реализовывать этот класс с нуля. Для DataTable классов есть отдельные представление.
Думаю на этом всё, я решил завтра поработать :) так что прошу прощения :) дома не стоит студия и ставить мне её честно говоря не очень хочется :)
В прямом биндинге нет особого смысла, так как существует представление по умолчанию! но, если вы биндите 1 и туже коллекцию к разным элементам списочного типа, то сортировка, группировка и весь функционал про который написано выше будет дублироваться, то есть фильтрация будет применяться на все элементы управления. Имеет смысл в данном случае создавать свое представление коллекции и передавать его в ItemsSource (биндить). Тогда в каждом из контролов всё будет раздельно =)
Для отключения синхронизации CurrentItem можно использовать свойство Selector.IsSynchronizedWithCurrentItem, оно доступно для всяких combobox'ов, listitem'ов и прочего наследованно от класса селектора.
...
Рейтинг: 0 / 0
Можно ли обновить ICollectionView без общего Refrash
    #39543937
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Код: c#
1.
2.
3.
//добавляем элемент
            sz_list.Where(p1 => p1.prsn.ID == p.ID).First().must_show = p.IsShown;
            added_personSz.Refresh(); // без рефреша UI не показывает, что элемент добавлен

Я не вижу добавляемого элемента, есть элемент, у которого меняется свойство.
...
Рейтинг: 0 / 0
Можно ли обновить ICollectionView без общего Refrash
    #39543946
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregvb_sub
Код: c#
1.
2.
3.
//добавляем элемент
            sz_list.Where(p1 => p1.prsn.ID == p.ID).First().must_show = p.IsShown;
            added_personSz.Refresh(); // без рефреша UI не показывает, что элемент добавлен


Я не вижу добавляемого элемента, есть элемент, у которого меняется свойство.

есть такое, если меняется через свойство и реализовано через фильтрацию, то только Refresh.
По другому не работает. Но можно написать прослойку которая будет фильтровать так, что реализация будет через Add\Remove\Insert и т.д. =)

https://drive.google.com/open?id=0BxmtlsFg8WIsdUFmVG1Od3I3S28
пример, как для List<T> сделать добавление\удаление без Refresh.
Если интересны примеры и иерархиями могу тоже пример скинуть, где то валяется
Это пример с коленки
...
Рейтинг: 0 / 0
Можно ли обновить ICollectionView без общего Refrash
    #39543992
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subЕсть необходимость менять (удалять/добавлять) элементы в sz_list, соответственно приходится рефрешить
ну дак заявленный вопрос выше не относится к этому коду:
vb_sub
Код: c#
1.
2.
//добавляем элемент
            sz_list.Where(p1 => p1.prsn.ID == p.ID).First().must_show = p.IsShown;


это действительно, как сказано выше - не добавление\удаление элеменов.
А на update элементов событие выше и интерфейс не реагирует.
Я так понял.
...
Рейтинг: 0 / 0
Можно ли обновить ICollectionView без общего Refrash
    #39544000
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
var q=sz_list.Where(p1 => p1.prsn.ID == p.ID);
q.First()=p.IsShown;


Потом нужно дернуть что-то типа:
Код: c#
1.
 OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset,q))


Не проверял.
sz_list - должна быть наблюдаемой коллекцией.
По идее, будет обновлена только одна запись - как я понял именно это цель...
...
Рейтинг: 0 / 0
Можно ли обновить ICollectionView без общего Refrash
    #39544002
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,
Наверно да. Это логично.
...
Рейтинг: 0 / 0
Можно ли обновить ICollectionView без общего Refrash
    #39544685
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
да, дайте посмотреть с иерархией, если будет несложно.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Можно ли обновить ICollectionView без общего Refrash
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]