powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Пример из книги Петцольда Microsoft WPF ListColorsElegantly
9 сообщений из 9, страница 1 из 1
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
    #37717623
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаю книжку и разглядываю примеры. Дошел до главы 13 и нашел неработающий пример ListColorsElegantly (конвертирую и открываю 10-й студией). Проблему я обошел, но не понимаю почему она возникает.
Проблема возникает в ListColorsElegantly.ListBoxOnSelectionChanged. Не понятно, почему при первом вызове ListBoxOnSelectionChanged lstbox.SelectedIndex = 137, SelectedItem = White, а вот SelectedValue = null? При повторных вызовах все нормально, а вот при первом такая вот проблема. Проект примера положил на http://dump.ru/file/5663172. Почему такое происходит?
...
Рейтинг: 0 / 0
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
    #37717655
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
    #37717844
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexxxxx,
selectedindex надо устанавливать и все будет ок.
а там selectedvalue устанавливается.
...
Рейтинг: 0 / 0
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
    #37718008
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiK,

Где там? В ColorListBox.SelectedColor? И почему все последующие вызовы, кроме первого, работают нормально?!
...
Рейтинг: 0 / 0
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
    #37718171
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexxxxx,

Код: c#
1.
lstbox.SelectedColor = SystemColors.WindowColor;


на
Код: c#
1.
lstbox.selectedindex= 137;
...
Рейтинг: 0 / 0
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
    #37718296
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiK,

При таком подходе нам нужно знать конкретный номер цвета, а кто его знает какой он там в общем случае и не меняется ли он (я знаю что при текущей реализации IEnumerable он будет всегда один и высмотреть его не сложно, но я говорю об общем случае). Это не то, для чего писалась вся эта конструкция. Ведь свойство SelectedColor было специально сделано для того, чтобы на "человеческом языке" задавать выбранный цвет.
При lstbox.SelectedColor = SystemColors.WindowColor; происходит SelectedValue = value; и вызов ListBoxOnSelectionChanged в момент когда SelectedIndex и SelectedItem уже установлены, а вот SelectedValue все еще = null. Видимо это особенность сеттера ListBox.SelectedValue. А вот при интерактивном изменении выбранного айтема вызов ListBoxOnSelectionChanged происходит в момент, когда уже все три свойства имеют новые значения. Может ли такое быть (что на мой взгляд довольно странно), или я просто запутался в отладчике?
...
Рейтинг: 0 / 0
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
    #37718495
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexxxxx,

твоя ошибка, в этом
авторедь свойство SelectedColor было специально сделано для того, чтобы на "человеческом языке" задавать выбранный цвет.
Это не правда. Ты это придумал или не так понял или еще чтото.
Код: c#
1.
2.
3.
4.
5.
public Color SelectedColor
        {
            set { SelectedValue = value; }
            get { return (Color)SelectedValue; }
        }


Этот selectedcolor обертка над selectedvalue, которое является по сути геттером. попробуй установи в него че нито :) и ничего не установится. Это поле нужно совсем для другого. Оно в себе содержит значение поля класса, которое ты указал в selectedvaluepath.


далее....

смотри: dataitem оборачивается в listboxitem.
все что мы видим и куда можем тыкнуть это listboxitem.
в данном случае ColorListBoxItem.


ты хочешь указать dataitem типа colors.blue и заставить листбокс перейти и выделить этот ColorListBoxItem.

и как должен листбокс, найти тот ColorListBoxItem в котором colors.blue лежит?
Ответ:никак.

Можно пробежаться по всем items и найти подходящий, и установить у него свойство isselected.

но и тут есть ньанс.
у тебя листбокс с виртуализацией, и можно выделить только те item , которые существуют.
а те что существуют ты их и видишь. все что ты не видишь, их в принципе нету.
И вопрос, как ты дойдешь до последнего в списке программно, если его нету в принципе?

Вариант:
ты заставишь прокрутиться srollviewer до нужной позиции и он отдаст команду, на генерацию item .
и тогда можно его будет выделить последний в списке.

можешь переключить листбокс в обычный режим, где все items сразу создаются, а не по мере попадания в область видиния.
и тогда сможешь выделить сразу, без заморачивания с прокруткой.
еще есть scrollintoview

Код: c#
1.
2.
lstbox.ScrollIntoView( lstbox.Items.GetItemAt(lstbox.Items.Count - 1));
lstbox.SelectedIndex = 140;



вот так можешь сделать.
притом отдавай себе отчет, что getitemAt берет dataitem.
потом этот dataitem отдается в scrollintoview и он уже сам все считает и крутится до нужной позиции, потом отдает команду на создание colorlistboxitem со всеми dataitem которые попали в обзор. в том числе он гарантирует, что в обзор попадет твой dataitem.
дальше вы помечаем isselected у colorlistboxitem с нужным dataitem и он подсвечивается выделенным.
подсветка делается с в помощью selectedindex.
...
Рейтинг: 0 / 0
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
    #37718641
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiKвсе что мы видим и куда можем тыкнуть это listboxitem.
в данном случае ColorListBoxItem.
ты хочешь указать dataitem типа colors.blue и заставить листбокс перейти и выделить этот ColorListBoxItem.
и как должен листбокс, найти тот ColorListBoxItem в котором colors.blue лежит?
Ответ:никак.
Можно пробежаться по всем items и найти подходящий, и установить у него свойство isselected.
Ну собственно я так и думал что он это делает. Раз есть сеттер у SelectedValue то должен же он как-то находить среди своих айтемов нужный.

AlexeiKно и тут есть ньанс.
у тебя листбокс с виртуализацией,
По чем видать? Поиск по буквам "вирту" в доке листбокса ничего не показал.

AlexeiKИ вопрос, как ты дойдешь до последнего в списке программно, если его нету в принципе?
Ну а в его Items должны же быть все.

Чет я совсем ничего не понимаю! :)
...
Рейтинг: 0 / 0
Пример из книги Петцольда Microsoft WPF ListColorsElegantly
    #37718653
Lexxxxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiK,

Дальнейшие эксперименты показали что при программной установке SelectedValue через ListColorsElegantly.SelectedColor в момент вызова ListBoxOnSelectionChanged свойство SelectedValue содержит значение, установленное в прошлый раз (соответственно в первый раз null), а вот свойства SelectedIndex и SelectedItem содержат уже новые значения, соответствующие новому значению SelectedValue. :)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Пример из книги Петцольда Microsoft WPF ListColorsElegantly
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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