Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 WPF: CollectionViewSource.GetDefaultView() в другом потоке  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21941
Просто оставлю здесь (крик души)

CollectionViewSource.GetDefaultView() для одной и той же коллекции возвращает другой экземпляр View, если вызывать не в потоке пользовательского интерфейса. Блин, нафига такие грабли?...

Картинка с другого сайта.
12 апр 18, 12:29    [21332838]     Ответить | Цитировать Сообщить модератору
 Re: WPF: CollectionViewSource.GetDefaultView() в другом потоке  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4030
Shocker.Pro
Просто оставлю здесь (крик души)

CollectionViewSource.GetDefaultView() для одной и той же коллекции возвращает другой экземпляр View, если вызывать не в потоке пользовательского интерфейса. Блин, нафига такие грабли?...

Картинка с другого сайта.

я уже не 1 раз об этом писали.
Получайте представление через Dispatcher.Invoke, диспатчер всегда выполняется в основном потоке :)
а в целом, я обычно просто создаю свое представление и не использую DefaultView. Так как 1 коллекция может отображаться более чем 1 контроле, а если использовать 1 представление, то текущий элемент и много чего еще будет синхронизироваться между элементами управления
проще просто
var view = new ListCollectionView(source); и все довольны.
разница только в том, что ListCollectionView принимает IList, а не IEnumerable
12 апр 18, 13:43    [21333211]     Ответить | Цитировать Сообщить модератору
 Re: WPF: CollectionViewSource.GetDefaultView() в другом потоке  [new]
vb_sub
Member

Откуда:
Сообщений: 774
решил для себя вместо CollectionViewSource использовать просто еще дополнительный список объектов с linq-фильтром после того, как
CollectionViewSource каким-то образом начинает генерить те же самые объекты, только с дригим хэшкодом, после чего UI отваливается.
12 апр 18, 13:47    [21333240]     Ответить | Цитировать Сообщить модератору
 Re: WPF: CollectionViewSource.GetDefaultView() в другом потоке  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21941
Roman Mejtes
Получайте представление через Dispatcher.Invoke, диспатчер всегда выполняется в основном потоке :)
Ну когда разобрался, то методы решения понятны )
Roman Mejtes
var view = new ListCollectionView(source); и все довольны.
в смысле, ты его создаешь в VM и потом биндишься к нему из ItemsSource?
12 апр 18, 13:52    [21333279]     Ответить | Цитировать Сообщить модератору
 Re: WPF: CollectionViewSource.GetDefaultView() в другом потоке  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4030
Shocker.Pro,

совершенно верно в ItemsControl при биндинге идет проверка, если переданная коллекция уже является ICollectionView, то он использует именно её, если коллекция не наследует этот интерфейс вызывается CollectionViewSource.GetDefaultView() и используется представление по умолчанию.
Принципов MVVM это не нарушает
12 апр 18, 14:00    [21333317]     Ответить | Цитировать Сообщить модератору
 Re: WPF: CollectionViewSource.GetDefaultView() в другом потоке  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21941
Ок, хороший вариант, воспользуюсь, спасибо )
12 апр 18, 14:02    [21333324]     Ответить | Цитировать Сообщить модератору
 Re: WPF: CollectionViewSource.GetDefaultView() в другом потоке  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21941
Shocker.Pro
Ок, хороший вариант, воспользуюсь, спасибо )
Тут, правда, другой бок вылез - ListCollectionView нетипизированный, так что для доступа к самой коллекции из VM приходится либо приводить явно, либо сохранять в локальном поле. Но все равно так удобнее.
12 апр 18, 14:08    [21333349]     Ответить | Цитировать Сообщить модератору
 Re: WPF: CollectionViewSource.GetDefaultView() в другом потоке  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21941
А началось-то все с того, что мне понадобилось присвоить
ListCollectionView.CustomSort=Comparer<...>.Default;
Вопрос, какого фига просто нельзя представление сортировать с помощью дефолтного компаратора - тогда достаточно было бы просто в разметке указать один флаг и спокойно реализовывать IComparable для элементов коллекции.
Хотя, может я просто не смог разобраться, как это включить.
12 апр 18, 14:15    [21333367]     Ответить | Цитировать Сообщить модератору
 Re: WPF: CollectionViewSource.GetDefaultView() в другом потоке  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 21941
Shocker.Pro
Roman Mejtes
var view = new ListCollectionView(source); и все довольны.
в смысле, ты его создаешь в VM и потом биндишься к нему из ItemsSource?
Забыл отписаться тогда - этот вариант тоже не прокатил. Если ListCollectionView создается не в UI-потоке, то потом UI-поток его пользовать не может.
18 апр 18, 18:26    [21349987]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить