Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Можно ли обновить ICollectionView без общего Refrash / 11 сообщений из 11, страница 1 из 1
27.10.2017, 20:01
    #39543528
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обновить ICollectionView без общего Refrash
Всем привет, у меня есть коллекция 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
27.10.2017, 22:39
    #39543569
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обновить ICollectionView без общего Refrash
конечно, можно даже сделать так, что они будут появляться в представлении коллекции, но при этом сама коллекция будет пустая.
начнем с того, что ICollectionView синхронизируется с основной коллекцией через интерфейс INotifyCollectionChanged который предоставляет события CollectionChanged.
Добавление\вставка\удаление\перемещение\замена элементов может быть только по 1 за 1 изменение.
Если источник такой интерфейс не поддерживает, можно либо дергать обработчик события с нужными параметрами, либо методы которые он вызывает. И эффект будет такой же.
+ еще есть такая фишка, что если вы передаете IEnumerable в ItemsSource элемент ItemsControl, то для него будет браться представление по умолчанию CollectionViewSource.GetDefaultView(), но если в ItemsSource передавать ICollectionView, то будет использовать непосредственно он.
Практически для все коллекций\перечислений используется представление ListCollectionView, от него можно унаследоваться и передавть в ItemsSource непосредственно его.
Завтра буду на работе, могу накидать пример, если сильно нужно :)
...
Рейтинг: 0 / 0
27.10.2017, 22:43
    #39543572
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обновить ICollectionView без общего Refrash
ну и как я уже написал, то, что вы возвращаете из медели представления ICollectionView в видел CollectionViewSource.GetDefaultView, это бесполезная хрень, потому как после того как вы зададите коллекцию sz_list в свойство ItemsSource, элемент управления сам получит представление по умолчанию :)

и еще 1 момент важно помнить CollectionViewSource.GetDefaultView в разных потоках будет возвращать разные представления. одно и тоже представление коллекции в разных потоках использовать нельзя.
...
Рейтинг: 0 / 0
28.10.2017, 13:48
    #39543674
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обновить ICollectionView без общего Refrash
Roman Mejtes,
да дайте пожалуйста пример. А ICollectionView нужно использовать вместо прямого биндинга к коллекции, когда нужно применять сортировку, фильтрацию, группировку или еще в каких-либо случаях?
...
Рейтинг: 0 / 0
28.10.2017, 17:33
    #39543733
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обновить ICollectionView без общего Refrash
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
29.10.2017, 12:41
    #39543937
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обновить ICollectionView без общего Refrash
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
29.10.2017, 12:56
    #39543946
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обновить ICollectionView без общего Refrash
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
29.10.2017, 14:29
    #39543992
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обновить ICollectionView без общего Refrash
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
29.10.2017, 15:11
    #39544000
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обновить ICollectionView без общего Refrash
Код: 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
29.10.2017, 15:16
    #39544002
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обновить ICollectionView без общего Refrash
refreg,
Наверно да. Это логично.
...
Рейтинг: 0 / 0
30.10.2017, 17:28
    #39544685
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обновить ICollectionView без общего Refrash
Roman Mejtes,
да, дайте посмотреть с иерархией, если будет несложно.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Можно ли обновить ICollectionView без общего Refrash / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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