![]() |
|
Модераторы: gambit, Kefir, Partizan |
![]()
|
|
| Rohoss |
|
||||||||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Есть два ListView
в первый добавляем элементы
а второй привязываем
В первом случае подписаться на событие очень легко
А как подписаться во втором случае? |
||||||||
|
|||||||||
| Kefir |
|
|||
|
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 22 Всего: 87 |
Расскажу вкратце:
Во втором случае контейнеры для даты будут сгенерированы автоматически самим ListView. На момент когда ты привязываешь ItemsSource контейнеров ещё нет, поэтому привязаться сложно. В ситуации когда контейнеры уже созданы для получения контейнеров можно использовать
Теперь насчёт генерации самих контейнеров. ItemContainerGenerator как раз за это отвечает. Если я не ошибаюсь, то lv2.UpdateLayout() заставит его сгенерировать нужные контейнеры прямо на месте и, если повезёт, то ты сможешь получить готовый контейнер. Однако это не очень хорошо - лучше привязываться к событию ItemContainerGenerator.StatusChanged и там уже колдовать. Последнее - почему может "не повезти". Если у тебя хост-панель внутри ListView виртуальная (по крайней мере у ListBox она такая), то значит, что контейнер будет создан только в ситуации, если его надо показать пользователю. То есть всё что за пределами видимости сгенерировано не будет и ты так и получишь null. На первый взгляд оно может выглядеть слишком пакостно, но в этом всём есть логика. |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Kefir, спасибо, как раз то что нужно
Дак, так и кажется |
|||
|
||||
| Kefir |
|
|||
|
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 22 Всего: 87 |
Я, честно говоря, вообще уже не помню когда в последний раз создавал контейнеры вручную. Всё на привязке данных завязано - шаблоны, дататриггеры и подобное. А на события у контейнеров приходилось подписываться только по праздникам. Ну и виртуализация, как ни крути. Ощущение пакости проходит если попытаться написать такую схему с автогенерацией самому - приходит понимание зачем всё это надо и почему так работает Рад был помочь. |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Это событие происходит множество раз, и даже тогда, когда ListViewItem'ы ещё не созданы. Но это не проблема, можно проверить их существования. Ну дело вот в чём, в событии ItemContainerGenerator.StatusChanged мы ведь подписываем необходимое нам события для ListViewItem, например lvi1.MouseDoubleClick +=. Однако, так как событие ItemContainerGenerator.StatusChange довольно часто происходит, мы получаем кучу подписок на lvi1.MouseDoubleClick. Эту проблему конечно можно решить например с помощью System.Reflection, или можно что-то писать в тегах ListViewItem... Но может быть в WPF предусмотрено для этого решение? |
|||
|
||||
| Kefir |
|
|||
|
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 22 Всего: 87 |
Ах да, забыл одну возможность - в стиле у контейнеров можно просто добавить <EventSetter>. Тогда можешь привязать эвент там и не мучаться с генератором.
|
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Не совсем понял... Под контейнером вы подразумеваете ListView? Если так, то я не знаю как добавить стиль для ListViewItem, они ведь привязуются... Если вы под контейнером понимаете ListViewItem, то его ведь всё равно нужно получить с помощью ItemContainerGenerator... Если можно приведите маленький пример |
|||
|
||||
| Kefir |
|
|||
|
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 22 Всего: 87 |
Нет, я имею в виду стиль сгенерированных контейнеров для дата-итемов.
Подредактируйте так:
И вуаля - каждый контейнер будет автоматом привязан к обработчику ListViewItem_MouseDoubleClick ;) |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Kefir, это отличное решение
и что ещё в этой решении мне нравится, в параметр sender обработчика ListViewItem_MouseDoubleClick передаётся не текущий ListViewItem, а непосредственно привязанный элемент коллекции, что очень таки в духе виртуализации |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Хотя с другой стороны, этот вариант не даст возможности получить доступа к данному ListViewItem в обработчике события...
|
|||
|
||||
| Kefir |
|
|||
|
«Hakuna Matata» ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1878 Регистрация: 25.1.2003 Где: Tampere, Suomi Репутация: 22 Всего: 87 |
Rohoss, я не помню чего там в сендере (я предполагал, что туда будет передан сам ListViewItem. Но если там действительно передаётся сам дата итем, то контейнер можно спокойно получать через ItemContainerGenerator
И на всякий случай замечу, что у ItemContainerGenerator есть ещё метод ItemFromContainer, который является методом ContainerFromItem только наоборот ;) Так что внутри обработчика ты можешь спокойно получать хоть сам дата итем, хоть его сгенерированный ListViewItem. |
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: 4 Всего: 18 |
Всё же ListViewItem передаётся в sender"е, это я не туда посмотрел
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | WPF и Silverlight | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |