|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
Кто может объяснить почему для кнопок работает присоединяемое событие Button.Click, а для ListBoxItem.Selected - нет? Пример XAML окна Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Обработчики в коде окна Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2018, 11:48 |
|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
Eld Haspприсоединяемое событиеЧто за новый зверь? Есть маршрутизируемое событие Событие Selected есть у Selector, а ListBoxItem не является селектором Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2018, 15:35 |
|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
Shocker.Pro, но есть же событие ListBoxItem.Selected. И если записать, так Код: xml 1. 2. 3. 4. 5.
То работает. По документации эта запись равносильно предыдущей, так же как и для кнопок. В редакторе при вводе XAML кода ListBox выходит подсказка с этим присоединённым свойством. Но оно не работает. Ошибок тоже не выдаёт. Я вот и понять не могу в чём дело? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2018, 17:01 |
|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
Shocker.ProСобытие Selected есть у Selector, а ListBoxItem не является селектором Код: xml 1.
При такой записи при сборке проекта выдаёт ошибку " CS1061 C# "ListBox" не содержит определения для "Selected", и не удалось найти доступный метод расширения "Selected", принимающий тип "ListBox" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку). " ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2018, 17:10 |
|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
Shocker.ProЧто за новый зверь? Не, не новый: Attached Events Overview Вот это: Код: xml 1.
неявно добавляет в скомпилированный код вот такую штуку: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
ну, а для ListBoxItem это не работает потому, что листбокс в своем статическом конструкторе для себя переопределяет ряд событий, в т.ч. MouseUp, которое ответственно в т.ч. за формирование события Click у кнопки. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2018, 17:38 |
|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
Сон Веры Павловныну, а для ListBoxItem это не работает потому, что листбокс в своем статическом конструкторе для себя переопределяет ряд событий, в т.ч. MouseUp, которое ответственно в т.ч. за формирование события Click у кнопки.Зачем тогда оставили это в синтаксисе ListBox, в подсказках к нему? Только в заблуждения вводят. А что с событием ListBox.Selected? Почему оно в редакторе, в подсказках есть, а при сборке выдаёт ошибку? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2018, 18:02 |
|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
Eld HaspСон Веры Павловныну, а для ListBoxItem это не работает потому, что листбокс в своем статическом конструкторе для себя переопределяет ряд событий, в т.ч. MouseUp, которое ответственно в т.ч. за формирование события Click у кнопки. А что с событием ListBox.Selected? Почему оно в редакторе, в подсказках есть, а при сборке выдаёт ошибку? А, я думал, впрос про почему Button.Click на ListBoxItem не отрабатывает. Приаттаченный к листбоксу ListBoxItem.Selected не отрабатывает при выборе ListBoxItem по той причине, что ListBoxItem унаследован от Visual, и генерируемые им routed events (которым в т.ч. является событие Selected) распространяются по визуальному дереву. А элементы, сгенерированные в ItemsControl (от которого унаследован ListBox), не являются частью визуального дерева самого ItemsControl, т.е. ListBoxItem, и ListBox - это разные визуальные дереья, поэтому событие просто не может всплыть до ListBox. Иллюстрация: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Код: 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.
- пли клике на нижнюю кнопку у ListBoxItem внутри StackPanel свойство IsSelected становится равно true, после чего вполне нормально отрабатывает ListBoxItem_OnSelected, и после него StackPanel_OnSelected, т.к. в этом случае ListBoxItem вполне находится внутри визуального дерева StackPanel. В общем, читайте общие сведения про routed events и деревья . Eld HaspЗачем тогда оставили это в синтаксисе ListBox, в подсказках к нему? Только в заблуждения вводят. Потому что механизм attached events является общим для всех элементов, унаследованных от UIElement, он определен внутри UIElement, и понятия не имеет о нюансах в своих многочисленных наследниках. P.S. Опять налицо какие-то странные манипуляции с тем, что в WPF делается легко и просто стандартными методами (в данном случае биндингом свойств). Мне за 8 лет работы с WPF ни разу не понабились attached events. Команды, присоединяемые к событиям через ACB и EventTrigger'ы, мне понадобились раза три от силы, и в очень экзотических случаях. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2018, 07:14 |
|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
есть логическое дерево и визуальное, учитывайте этот момент. правильнее писать не Button.Click, а ButtonBase.Click не могу понять, чего автор пытается добиться :) может имеет смысл использовать команды и CommandBinding? сами RoutedEvent'ы для внутренней реализации контролов, а не прикладного функционала. У селектора существует свойство SelectionChanged, использовать нужно его, а не городить какую то фигню, но лично я даже так не делаю, потому что вопрос выделения и списка выделенных элементов обычно лежит на представлении списка и требуется только в VM ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2018, 12:08 |
|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
Roman Mejtesне могу понять, чего автор пытается добиться :)Пытаюсь обучиться. При чтении натыкаюсь на что-то повторяю, пытаюсь изменить. Всплывает непонятное. И "добиваюсь" понимая - но порой не доходит сразу. Roman Mejtesно лично я даже так не делаю, потому что вопрос выделения и списка выделенных элементов обычно лежит на представлении списка и требуется только в VM А если это нужно только для взаимодействия элементов внутри окна. Изменения в данных это не влечёт за собой. По выбранному значению в одном элементе надо "подсветить" значения в другом. Как тогда лучше сделать? Нужно ли для этого привлекать VM? Что посоветуете? Сон Веры ПавловныВ общем, читайте общие сведения про routed events и деревья.Читал, но похоже плохо. Буду дальше штудировать. Просто мне в голову даже не пришёл вариант, что вложенный элемент может быть из другого дерева. Спасибо за внимание. Сон Веры ПавловныОпять налицо какие-то странные манипуляции с тем, что в WPF делается легко и просто стандартными методами (в данном случае биндингом свойств)Это скорее от незнания. Читаю - но знания появляются значительно медленнее чем накапливается информация из прочитанного. Поэтому в голове от дальнейшего чтения - бардак. Пытаюсь как-то применить прочитанное чтобы разобраться в этом бардаке. Что касается данного примера, то событие Selected лучше обработать в привязке свойства SelectedItem родительского ListBox. Я правильно Вас понял? Сон Веры ПавловныКоманды, присоединяемые к событиям через ACB и EventTrigger'ы, мне понадобились раза три от силы, и в очень экзотических случаях.Roman Mejtesможет имеет смысл использовать команды и CommandBinding?А тогда такой вопрос. Два ListBox. При наведении курсора в первом (событие MouseEnter) надо изменять доступный список значений во втором ListBox. У меня это сделано опять таки через EventSetter в стиле для вложенных ListBoxItem. А как правильно такое сделать? Без использования EventSetter? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2018, 21:02 |
|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
Eld HaspА тогда такой вопрос. Два ListBox. При наведении курсора в первом (событие MouseEnter) надо изменять доступный список значений во втором ListBox. У меня это сделано опять таки через EventSetter в стиле для вложенных ListBoxItem. А как правильно такое сделать? Без использования EventSetter? Зачем здесь MouseEnter? Чтобы все дергалось при каждом чихе мыши? Я так понимаю, что требуются два зависимых списка, и набор значений второго зависит от выбранного значения в первом - обычное отношение master-detail. Это все можно сделать через один биндинг к выбранному значению в первом списке, отображающем элементы, сами содержащие список: Код: 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. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101.
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2018, 08:11 |
|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныЗачем здесь MouseEnter? Чтобы все дергалось при каждом чихе мыши?Спасибо за внимание! Организовано так: при наведении мыши на элемент (MouseEnter) в первом ListBox - во втором отображается список элементов второго уровня в режиме подсказки. Пользователь просматривает его, если это нужный список - он выбирает этот список и, при выходе из первого ListBox, во втором отображается список соответствующий выбранному из первого (SelectedItem). Я поэтому и говорю, что обработка события MouseEnter по сути имеет только вспомогательную, визуальную функцию. На выбор данных это не влияет. Как методологически верно будет разделить в этом случае функции между View и VM? Где и как правильнее производить вывод информации для второго ListBox в режиме подсказки? Что можно использовать вместо прямой обработке в коде события MouseEnter? Первоначально, я делал даже, два отдельных ListBox (получалось всего три ListBox): один для отображения выбранного списка, второй для режима подсказки. Но так как по сути они отображают сходные данные и которые не нужны одновременно, решил совместить эти функции в одном ListBox. Интересует, в первую очередь, сама методология разделения функций в рамках MVVM. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2018, 11:46 |
|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
Eld Hasp, похожая тема ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2018, 12:05 |
|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
Eld HaspГде и как правильнее производить вывод информации для второго ListBox в режиме подсказки? Там, где обычно выводятся подсказки - в тултипе: Код: xml 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2018, 12:12 |
|
Присоединяемое событие ListBoxItem.Selected
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныТам, где обычно выводятся подсказки - в тултипе: Да, действительно так лучше смотрится. Спасибо! vb_subпохожая темаСпасибо за совет! Посмотрел, но там не много другое. Там обрабатывается выбор элементов. В моём случае больше подходит совет Сон Веры Павловны - использовать тултип. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2018, 13:48 |
|
|
start [/forum/topic.php?fid=21&msg=39714833&tid=1440386]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
163ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 274ms |
0 / 0 |