|
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
|
|||
---|---|---|---|
#18+
Читаю книжку и разглядываю примеры. Дошел до главы 13 и нашел неработающий пример ListColorsElegantly (конвертирую и открываю 10-й студией). Проблему я обошел, но не понимаю почему она возникает. Проблема возникает в ListColorsElegantly.ListBoxOnSelectionChanged. Не понятно, почему при первом вызове ListBoxOnSelectionChanged lstbox.SelectedIndex = 137, SelectedItem = White, а вот SelectedValue = null? При повторных вызовах все нормально, а вот при первом такая вот проблема. Проект примера положил на http://dump.ru/file/5663172. Почему такое происходит? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2012, 12:27 |
|
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2012, 12:39 |
|
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
|
|||
---|---|---|---|
#18+
Lexxxxx, selectedindex надо устанавливать и все будет ок. а там selectedvalue устанавливается. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2012, 13:55 |
|
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
|
|||
---|---|---|---|
#18+
AlexeiK, Где там? В ColorListBox.SelectedColor? И почему все последующие вызовы, кроме первого, работают нормально?! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2012, 14:53 |
|
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
|
|||
---|---|---|---|
#18+
Lexxxxx, Код: c# 1.
на Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2012, 16:04 |
|
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
|
|||
---|---|---|---|
#18+
AlexeiK, При таком подходе нам нужно знать конкретный номер цвета, а кто его знает какой он там в общем случае и не меняется ли он (я знаю что при текущей реализации IEnumerable он будет всегда один и высмотреть его не сложно, но я говорю об общем случае). Это не то, для чего писалась вся эта конструкция. Ведь свойство SelectedColor было специально сделано для того, чтобы на "человеческом языке" задавать выбранный цвет. При lstbox.SelectedColor = SystemColors.WindowColor; происходит SelectedValue = value; и вызов ListBoxOnSelectionChanged в момент когда SelectedIndex и SelectedItem уже установлены, а вот SelectedValue все еще = null. Видимо это особенность сеттера ListBox.SelectedValue. А вот при интерактивном изменении выбранного айтема вызов ListBoxOnSelectionChanged происходит в момент, когда уже все три свойства имеют новые значения. Может ли такое быть (что на мой взгляд довольно странно), или я просто запутался в отладчике? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2012, 16:51 |
|
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
|
|||
---|---|---|---|
#18+
Lexxxxx, твоя ошибка, в этом авторедь свойство SelectedColor было специально сделано для того, чтобы на "человеческом языке" задавать выбранный цвет. Это не правда. Ты это придумал или не так понял или еще чтото. Код: c# 1. 2. 3. 4. 5.
Этот selectedcolor обертка над selectedvalue, которое является по сути геттером. попробуй установи в него че нито :) и ничего не установится. Это поле нужно совсем для другого. Оно в себе содержит значение поля класса, которое ты указал в selectedvaluepath. далее.... смотри: dataitem оборачивается в listboxitem. все что мы видим и куда можем тыкнуть это listboxitem. в данном случае ColorListBoxItem. ты хочешь указать dataitem типа colors.blue и заставить листбокс перейти и выделить этот ColorListBoxItem. и как должен листбокс, найти тот ColorListBoxItem в котором colors.blue лежит? Ответ:никак. Можно пробежаться по всем items и найти подходящий, и установить у него свойство isselected. но и тут есть ньанс. у тебя листбокс с виртуализацией, и можно выделить только те item , которые существуют. а те что существуют ты их и видишь. все что ты не видишь, их в принципе нету. И вопрос, как ты дойдешь до последнего в списке программно, если его нету в принципе? Вариант: ты заставишь прокрутиться srollviewer до нужной позиции и он отдаст команду, на генерацию item . и тогда можно его будет выделить последний в списке. можешь переключить листбокс в обычный режим, где все items сразу создаются, а не по мере попадания в область видиния. и тогда сможешь выделить сразу, без заморачивания с прокруткой. еще есть scrollintoview Код: c# 1. 2.
вот так можешь сделать. притом отдавай себе отчет, что getitemAt берет dataitem. потом этот dataitem отдается в scrollintoview и он уже сам все считает и крутится до нужной позиции, потом отдает команду на создание colorlistboxitem со всеми dataitem которые попали в обзор. в том числе он гарантирует, что в обзор попадет твой dataitem. дальше вы помечаем isselected у colorlistboxitem с нужным dataitem и он подсвечивается выделенным. подсветка делается с в помощью selectedindex. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2012, 17:52 |
|
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
|
|||
---|---|---|---|
#18+
AlexeiKвсе что мы видим и куда можем тыкнуть это listboxitem. в данном случае ColorListBoxItem. ты хочешь указать dataitem типа colors.blue и заставить листбокс перейти и выделить этот ColorListBoxItem. и как должен листбокс, найти тот ColorListBoxItem в котором colors.blue лежит? Ответ:никак. Можно пробежаться по всем items и найти подходящий, и установить у него свойство isselected. Ну собственно я так и думал что он это делает. Раз есть сеттер у SelectedValue то должен же он как-то находить среди своих айтемов нужный. AlexeiKно и тут есть ньанс. у тебя листбокс с виртуализацией, По чем видать? Поиск по буквам "вирту" в доке листбокса ничего не показал. AlexeiKИ вопрос, как ты дойдешь до последнего в списке программно, если его нету в принципе? Ну а в его Items должны же быть все. Чет я совсем ничего не понимаю! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2012, 18:46 |
|
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
|
|||
---|---|---|---|
#18+
AlexeiK, Дальнейшие эксперименты показали что при программной установке SelectedValue через ListColorsElegantly.SelectedColor в момент вызова ListBoxOnSelectionChanged свойство SelectedValue содержит значение, установленное в прошлый раз (соответственно в первый раз null), а вот свойства SelectedIndex и SelectedItem содержат уже новые значения, соответствующие новому значению SelectedValue. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2012, 18:54 |
|
|
start [/forum/topic.php?fid=21&fpage=42&tid=1441873]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
others: | 333ms |
total: | 449ms |
0 / 0 |