|
Команды в WPF (ListBoxItem.Selected)
|
|||
---|---|---|---|
#18+
Изучаю WPF недавно. Дошёл до WPF команд. Читаю-читаю и что-то, по мере чтения, в голове только каша увеличивается. Помогите, на примере понять как создать команду, как ею пользоваться. Описание примера: Простой ListBox , отображающий свойство ListItem класса AuxiliaryClass , выполняющего роль ViewModel. При выделении элемента ListBox (событие ListBoxItem.Selected) его Content передаётся в свойство AuxiliaryClass.SelectedString и TextBlock , который привязан к этому свойству, отображает его. На примере показываю как это реализовано с помощью кода и событий. Класс AuxiliaryClass (ViewModel) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
XAML окна Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Обработчик в коде окна Код: c# 1. 2. 3. 4.
Окажите помощь - как создать и подключить WPF команду для тех же самых действий? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2018, 00:25 |
|
Команды в WPF (ListBoxItem.Selected)
|
|||
---|---|---|---|
#18+
Что-то здесь совсем странное нарисовано. Во-первых, зачем выделение у ListBox устанавливать через событие, когда его можно просто забиндить на свойство модели? Во-вторых, использование EventSetter - не самый лучший выход, т.к. они работают только с хэндлерами, определенными в code behind, который есть далеко не всегда (например, в словарном стиле его нет). Здесь лучше использовать AttachedCommandBehavior . Или связку EventTrigger из System.Windows.Interactivity + EventToCommand из MVVM Light Toolkit: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: 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.
(класс RelayCommand - тоже из MVVM Light). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2018, 09:05 |
|
Команды в WPF (ListBoxItem.Selected)
|
|||
---|---|---|---|
#18+
Сон Веры Павловны авторЧто-то здесь совсем странное нарисовано Странное .... Поэтому и обращаюсь за помощью. Часть странностей из-за попытки упростить пример.авторВо-первых, зачем выделение у ListBox устанавливать через событие, когда его можно просто забиндить на свойство модели?В данном случае работать будет несколько по иному. Можно было бы и просто забиндить TextBlock на SelectItem. Но при снятии выделения в ListBox (допустим, при обновлении коллекции) обнулится и связанное свойство. Если же делать это по событию, то в свойстве останется последнее выделенное значение. Идея примера - передать выделенное значение в связанный класс (играющий роль VM). Пример чисто для обучения. Понять как тоже самое можно сделать (или нельзя?) используя вместо события WPF команду. авторВо-вторых, использование EventSetter - не самый лучший выход, т.к. они работают только с хэндлерами, определенными в code behind, который есть далеко не всегда (например, в словарном стиле его нет). Здесь лучше использовать AttachedCommandBehavior. Или связку EventTrigger из System.Windows.Interactivity+EventToCommand из MVVM Light Toolkit:В Вашем решении, Вы подключаете команду через Триггер. То есть команду к событию состыковать можно только таким образом? Меня просто ставит немного в тупик как в примерах из интернета просто подключается команда. Например Код: xml 1.
Ни каких триггеров. Просто указана команда и всё. Поэтому никак понять и не могу, как добиться такой простоты использования собственной команды? Пытаюсь понять всё это - но от большей информации, только больший бардак в голове. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2018, 16:43 |
|
Команды в WPF (ListBoxItem.Selected)
|
|||
---|---|---|---|
#18+
Eld HaspВ данном случае работать будет несколько по иному. Можно было бы и просто забиндить TextBlock на SelectItem. Но при снятии выделения в ListBox (допустим, при обновлении коллекции) обнулится и связанное свойство. Если же делать это по событию, то в свойстве останется последнее выделенное значение. Ничего не мешает реализовать логику сеттера забинденного свойства так, чтобы свойство либо не менялось при null-значениях, либо хранило последнее установленное значение где-то еще. Почему я настаиваю именно на биндинге свойства: у вас свойство, и логика его установки разнесены по разным классам, это есть нарушение принципа единственности ответственности, и размывание логики, инкапсулированной во вьюмодели. Eld HaspПример чисто для обучения. Понять как тоже самое можно сделать (или нельзя?) используя вместо события WPF команду. Странный пример. Из области "как научиться пользоваться отверткой, используя её вместо стамески". Eld HaspавторВо-вторых, использование EventSetter - не самый лучший выход, т.к. они работают только с хэндлерами, определенными в code behind, который есть далеко не всегда (например, в словарном стиле его нет). Здесь лучше использовать AttachedCommandBehavior. Или связку EventTrigger из System.Windows.Interactivity+EventToCommand из MVVM Light Toolkit:В Вашем решении, Вы подключаете команду через Триггер. То есть команду к событию состыковать можно только таким образом? Меня просто ставит немного в тупик как в примерах из интернета просто подключается команда. Например Код: xml 1.
Ни каких триггеров. Просто указана команда и всё. Поэтому никак понять и не могу, как добиться такой простоты использования собственной команды? Пытаюсь понять всё это - но от большей информации, только больший бардак в голове. Просто указана команда потому, что Button реализует ICommandSource , и знает, как вызвать команду ( ICommand ), как передать ей параметры, как проверить, можно ли выполнять команду, итд. А ListBox не реализует ICommandSource, и не знает, как работать с командами, поэтому команды для него назначаются окольными путями - ACB, EventTrigger'ы, итд. Отдельный случай - когда элемент реализует ICommandSource, но нам нужно связать модель с событием, которое не инициирует команд - например, MouseEnter. Но, поскольку у вас вызывает затруднения даже самый простой случай, рекомендую пока разбираться только с ним: Код: 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.
Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Разумеется, в жизни редко когда создают свои специализированные имплементации ICommand на каждый случай использования - существует куча готовых реализаций, тот же RelayCommand из MVVM Toolkit (вышеприведенный MyCommand примерно так и реализован). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2018, 08:12 |
|
|
start [/forum/search_topic.php?author=VitY0k&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 441ms |
total: | 616ms |
0 / 0 |