|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Хотел изменять вид ListBoxItem в зависимости от контента и внешних свойств, но то ли я что-то не так делаю, то ли ... В общем у меня сложилось впечатление, что MultiDataTrigger в стилях ListBoxItem не работает. Специально сделал конвертер и точку останова в нём для проверки. Конвертер даже не вызывается. Действительно, MultiDataTrigger в ListBoxItem не работает? Или я опять что-то не так делаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 00:11 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
вы искренне считаете, что можно ответить на ваш вопрос без кода? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 00:35 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Shocker.Proвы искренне считаете, что можно ответить на ваш вопрос без кода?Ну, вообще-то, я думал да. Ответят - да, не работаю. И я брошу эту затею. Но по Вашему вопросу - похоже, возможны варианты. Вот пример. Класс для заполнения Listbox.ItemsSorce Код: c# 1. 2. 3. 4. 5.
ListBox со стилем ItemContainerStyle Код: 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. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
В примере. Просто Trigger на IsSelected работает нормально. Первый DataTrigger - попытка установить цвет фона строки в зависимости от свойства содержащегося в Content объекта. Второй DataTrigger - установить цвет фона строки в зависимости от наведения мыши. MultiDataTrigger - установить фон в зависимости от свойства объекта и наведения мыши. Конечно, можно попробовать сделать это через StyleSelector - но он точно не обновляется при изменении объектов источника. не подходит для той цели, что мне нужна. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 03:11 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Вот это: Код: xml 1.
- с какого перепугу? Стиль для ListBoxItem, и у него в данном случае выше по визуальному дереву нет никаких ancestors с типом ListBoxItem. В стиле везде должно быть: Код: xml 1.
а то, что у вас, могло бы использоваться в стиле внутри DataTemplate, либо если бы у стиля был переопределен ControlTemplate. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 06:17 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныВот это: Код: xml 1.
- с какого перепугу? Стиль для ListBoxItem, и у него в данном случае выше по визуальному дереву нет никаких ancestors с типом ListBoxItem. В стиле везде должно быть: Код: xml 1.
а то, что у вас, могло бы использоваться в стиле внутри DataTemplate, либо если бы у стиля был переопределен ControlTemplate.Когда в конструкторе создаю привязку, при выборе RelativeSource Self - показывает привязку к самому триггеру DataTrigger. Исправил в "ручную" Код: xml 1. 2. 3. 4. 5. 6.
Первый DataTrigger - стал работать как задумано. Получается конструктор даёт неверные привязки? Но второй DataTrigger на привязывание свойства IsMouseOver - всё равно не работает. С ним что не так? С использованием DataTemplate - тоже делал. Но там также не работало. Здесь привёл вариант без DataTemplate - для сокращения примера. Сначала хочу разобрать с тем что по проще - потом усложнять. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 11:06 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Вот еще вариант, без всяких DataTrigger'ов: Код: 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. 28.
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 11:11 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Eld HaspПервый DataTrigger - стал работать как задумано. Получается конструктор даёт неверные привязки? В каком конструкторе? В UI-дизайнере? Я лично им не пользуюсь вообще, где он там может ошибаться - понятия не имею.. Eld HaspНо второй DataTrigger на привязывание свойства IsMouseOver - всё равно не работает. С ним что не так? Вообще тут и обычный триггер будет работать, т.к. IsMouseOver - это DP самого контрола, для которого предназначен стиль. Но у меня на win7 вполне работает и в DataTrigger'е. Может, опять какие-то нюансы отличий в реализациях, зависящих от версии ОС. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 11:29 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
для того, чтоб задний фон менялся, нужно переопределить шаблон элемента ListBoxItem.ControlTemplate, тогда всё будет гуд. У меня в Win10 свойство Backgroud для этого элемента со стандартным шаблоном тоже не работает. Вообще не часто, но сталкивался с такой проблемой, что в одной версии Windows элемент выглядит одним образом, а в другой совершенно иначе. По причине дефолтных шаблонов. Довольно неприятная особенность, если используешь стандартный вид интерфейса, именно по этому в примере, что я сюда закинул, я меняю свойство TextElement.Foreground :D ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 11:41 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Roman MejtesВот еще вариант, без всяких DataTrigger'ов: Здорово! Мне такая мысль даже в голову не пришла! Для того что мне нужно - отлично подходит. Но всё же, уже из чистого интереса, а что же с DataTrigger не так? Хотелось бы, раз уже столкнулся с этим, понять до конца. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 11:46 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Roman MejtesВообще не часто, но сталкивался с такой проблемой, что в одной версии Windows элемент выглядит одним образом, а в другой совершенно иначе.Да, нахрен, постоянно. Складывается впечатление, что нужно для всех стандартных контролов скачать стандартные же шаблоны и положить их широковещательно в ресурсы приложения, чтобы не иметь в дальнейшем головняка. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 11:56 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Код: 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. 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.
Вот рабочий пример, скопированный с вашего и подправленный, естественно триггеры надо доработать, иначе там какая то новогодняя елка. И модель я заменил на свою, так как вашу пилить лень ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 12:00 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Shocker.ProДа, нахрен, постоянно. Складывается впечатление, что нужно для всех стандартных контролов скачать стандартные же шаблоны и положить их широковещательно в ресурсы приложения, чтобы не иметь в дальнейшем головняка. Ну, у меня еще с тех времен, когда была нужда поддерживать проекты для XP, в App.xaml сидит вот такое: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 12:08 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныEld HaspПервый DataTrigger - стал работать как задумано. Получается конструктор даёт неверные привязки? В каком конструкторе? В UI-дизайнере? Я лично им не пользуюсь вообще, где он там может ошибаться - понятия не имею.. С этим ясность полная - конструктор вещь не надёжная...Сон Веры ПавловныEld HaspНо второй DataTrigger на привязывание свойства IsMouseOver - всё равно не работает. С ним что не так? Вообще тут и обычный триггер будет работать, т.к. IsMouseOver - это DP самого контрола, для которого предназначен стиль. Да, обычный, конечно, будет работать. Но мне нужен MultiDataTrigger в котором два условия. А DataTrigger'а - это для проверки работы условий по отдельности.Сон Веры ПавловныНо у меня на win7 вполне работает и в DataTrigger'е. Может, опять какие-то нюансы отличий в реализациях, зависящих от версии ОС.Да, я на 10-ке делаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 12:12 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Roman MejtesВот рабочий пример, скопированный с вашего и подправленный, естественно триггеры надо доработать, иначе там какая то новогодняя елка. И модель я заменил на свою, так как вашу пилить леньНовогодняя ёлка и модель не важны. Мне бы только суть понять. На сколько понял (в т.ч. и из Вашей переписки с Сон Веры Павловны ) в данном случае (для Win 10) для переопределения цвета фона надо явно в шаблоне прописывать Border (или иной элемент с фоном). Спасибо за внимание и помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 12:24 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Roman Mejtes, Shocker.Pro - ещё раз СПАСИБО вам! Окончательный вариант составленный с Вашей помощью. Код: 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. 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.
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 21:16 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
а) обычно переменная статус, состояние имеет не только 2 значения true\false, а те переменные\поля которые имеют логическое состояние верно\неверно называют иначе. Типа IsMouseOver, CanHide и т.д. Тогда тем, кто будет разрабатывать после вас, будет понятно, что это за поле и за что оно отвечает. А Статус, это хер пойми вообще, что. Что отражает это AttachedProperty не ясно, а в комментарии написано "состояние статуса"... б) в ControlTemplate делать Binding и DataTrigger'ы, это не очень круто. Лучше делать это в стиле или в макете. Сам по себе ControlTemplate не должен быть привязан к какой то модели. Ведь элементы управления имеют абстракцию от вашей системы. В идеале, в ControlTemplate лучше использовать {TemplateBinding} или {Property, RelativeSource={RelativeSource ParentTemplate}}. Или относительное связывание. Но его имеет смысл избегать вообще. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2018, 22:52 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Roman Mejtesа) обычно переменная статус, состояние имеет не только 2 значения true\false, а те переменные\поля которые имеют логическое состояние верно\неверно называют иначе. Типа IsMouseOver, CanHide и т.д. Тогда тем, кто будет разрабатывать после вас, будет понятно, что это за поле и за что оно отвечает. А Статус, это хер пойми вообще, что. Что отражает это AttachedProperty не ясно, а в комментарии написано "состояние статуса"... б) в ControlTemplate делать Binding и DataTrigger'ы, это не очень круто. Лучше делать это в стиле или в макете. Сам по себе ControlTemplate не должен быть привязан к какой то модели. Ведь элементы управления имеют абстракцию от вашей системы. В идеале, в ControlTemplate лучше использовать {TemplateBinding} или {Property, RelativeSource={RelativeSource ParentTemplate}}. Или относительное связывание. Но его имеет смысл избегать вообще. Подправил по Вашим рекомендациям. Посмотрите так правильнее будет? Код: 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. 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. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
И я не совсем понял на счёт разделения шаблона и стиля. Я воспринимал, что шаблон это часть стиля. Ведь шаблон всё равно применяется через стиль. Получается такое понимание - не верно. В чём смысл разделения шаблона и стиля? Ведь потом для их совместно применения всё равно приходится их объединять. Что не так я понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2018, 13:01 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Roman Mejtes, и ещё такой вопрос. Как я понял из дефолтного шаблона ListBoxItem, встроенный Border имеет имя BD. И его стиль не связан со стилем ControlTemplate. Поэтому приходится создавать свой шаблон где эта связь есть. Верно ли, что в случае такого дефолтного шаблона невозможно получить доступ к свойствам встроенного Border ? И создание своего шаблона - обязательно? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2018, 13:08 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Как говнякать XAML файлы обычно определено на уровне политики компании или личных, не претендую на истину, пишу !очевидные вещи!. Сам я, как правило, разделяю XAML файл на 3 группы. Сразу скажу, что при этом я не использую CodeBehind классы, такие как Window и UserControl, потому, что мне это не очень удобно, но всё это относится и к обычному подходу, которые предлагает нам VS изначально. Файл формы\страницы\user control'а, такие файлы относятся к 1 группе. Да и можно комбинировать оба подхода. Все файлы во всех 3 группа, у меня, имеют корневой элемент ResourceDictionary. Которые собраны в некую иерархию ресурсов приложения с корнем в App.xaml файле. За создание форм, отвечает простенький класс, которые знает, для какого окна какой корневой шаблон отображения мне в нём нужно отобразить. 1) ресурсные xaml файлы с макетом приложения, это файлы которые содержат в основном шаблоны данных (модели представления) DataTemplate'ы. Для каждого DataTemplate'а указано свойство DataType. Никаких ресурсов, шаблонов или стилей, в идеале, в этом файле быть не должно. В шаблоне данных я определяю расположение всех элементов управления (макет), Binding'и свойств и команд к модели представления, DataTrigger'ы, ссылки на ресурсы приложения, вполне допустимы конвертеры, особенно если они используются только в этом файле. Так как в макете определено только это, он легко читается, не перегружен ненужными стилями и шаблонами. Мне совершенно без разницы как будет выглядеть кнопка, главное знать, как она расположена в макете, с какой командой связана и что на ней отображается. При таком подходе для каждой модели я создаю отдельный файл, то есть файл DataTemplates\Person.xaml будет отображать шаблон для объекта класса Person, в котором будет отображаться свойство Person.DisplayName или какое то еще, в зависимости от названия шаблона. В файле может быть несколько шаблонов отображения Person с датой рождения, с телефоном и так далее. Каждый из них я могу применять в списке, дереве, комбобоксе и легко их переключать, делает интерфейс более динамичным. 2) вторая группа это ресурсные файлы стилей в которых я храню элементы Style, ControlTemplate, Storyboard. Как правило, на 1 xaml файл, названный в честь соответствующего типа элемента управления (к примеру, ProgressBar), в нём будет один стиль и один шаблон, определяющий внешний вид этого элемента управления. Если стилей необходимо несколько, можно и в 1 файл всё упихать, найти будет не очень сложно. В этих же файлах ресурсах можно хранить анимацию которые вы используйте в стиле\шаблоне и т.д. В этих файлах я максимально абстрагируюсь от модели представления. Ведь совершенно не важно в какой модели отображается кнопка или другой элемент управления. То есть на уровне описания стиля и шаблона я не должен думать, в какой модели этот стиль будет применяться. Он должен быть применим везде. Связывание можно определять только на уровне визуального дерева, между свойствами других элементов управления и само собой собственных свойств определяющих состояние, типа IsMouseOver или IsEnable Так как для каждого элемента управления у меня свой файл или группа файлов, мне не приходится долго искать тот участок кода, который отвечает за внешний вид элемента управления. Мне не нужно будет копаться во всем дереве или использовать какие то примочки типа VisualTree Explorer'а и прочей ерунды (в крайних случаях), копировать стили и шаблоны в разные файлы Таким же образом, в библиотеках с элементами управления (контролами) стиль по умолчанию и его шаблон хранятся в Themes\Generic.xaml (как корневой xaml файл). И могут быть переопределены. 3) файлы ресурсов, в которых хранится наборы строк локализации интерфейса, кисти, геометрию для иконок, другие ресурсы, которые как правило подключаются как динамические. Всё это в конечном счете объединяется через MergeDictionary. При этом нужно помнить, что сами по себе ресурсы не создаются, когда загружен XAML ResourceDictionary, ресурс загружается только в момент обращения к нему. Есть у такого подхода некоторые минусы: Шаблон данных сам по себе не является элементом управления и его внутреннее состояние элементов управление (к примеру, фокус на кнопки) определен внутри ContentPresenter'а, если ControlPresenter пересоздаст свое визуальное дерево на основе шаблона, это состояние кнопки будет потеряно, ведь появится совершенно другая кнопка. Для примера, смотрите как работает TabControl. Но этот всё решаемо. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2018, 13:24 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Roman MejtesКак говнякать XAML файлы обычно определено на уровне политики компании или личных, не претендую на истину, пишу !очевидные вещи!. Сам я, как правило, разделяю XAML файл на 3 группы. ..........Огромное спасибо за такой подробный и развёрнутый ответ! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2018, 13:46 |
|
MultiDataTrigger в ListBoxItem
|
|||
---|---|---|---|
#18+
Раз уж тут мастер-класс, позволю себе напомнить Roman MejtesЯ готовлю маленькую статью на эту тему :( готово процентов на 50, когда закончу пока не знаю, давно обещал Суть в том, что на базе представления коллекции иерархия разворачивается в список, для отображения дерева можно использовать любые списочные контролы. То есть добавить дерево можно в combobox, listbox, datagrid с минимальными затратами и переработками. работает быстрее, поддерживает мультиселект, иерархические команды, вставку элементов в любую ветку и многое другое. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2018, 14:06 |
|
|
start [/forum/topic.php?fid=21&fpage=4&tid=1440383]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 237ms |
total: | 383ms |
0 / 0 |