|
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 86
|
||||||
WPF Кастомный контрол ListBox с CheckBox в качестве элементов21.11.2019, 14:36. Показов 15017. Ответов 55
Всем доброго времени суток!
Имею вот такой объект на формочке (листбокс с чекбоксами вместо элементов).
Вопрос 1: Как можно получить список отмеченных чекбоксов? Вопрос 2: Как можно оформить это в виде отдельного UserControl, чтобы можно было добавить его на форму и привязываться к допустим отмеченным элементам?
0
|
||||||
| 21.11.2019, 14:36 | |
|
Ответы с готовыми решениями:
55
Кастомный контрол Кастомный контрол на winforms |
|
Модератор
|
|
| 27.11.2019, 16:15 | |
|
tagota, я сейчас без компа до НГ.
И мне трудно со смарта разбирать такие нюансы. Для этого всё-таки нужен дебагер. Если вам очень надо, то могу вам писать, что надо делать, какой код куда вставлять. Вы мне будете сообщать результаты. В итоге разберёмся, но на это уйдеёт очень много времени. Мне не трудно, но насколько оно вам надо?
0
|
|
|
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 86
|
|
| 29.11.2019, 10:37 [ТС] | |
|
Элд Хасп, я понял.
Конкретно в данном случае задача конечно решается экспандером, как Вы и сказали, но пока я разбирался, у меня таки появился спортивный интерес научиться делать свои контролы, под конкретные цели. В интернете вроде есть темы по разработке простых контролов без множества привязок и прочего, но вот я попытался копнуть чуть глубже и таки упёрся. Чем не нравится XAML, так это тем, что если что-то не работает, то он тебе не скажет почему..) Меня время не сильно жмёт, так что я готов по Вашей схеме писать код. А надобность, как я и сказал - научиться писать своё, потому что ситуации разные могут возникать.
0
|
|
|
Модератор
|
|
| 29.11.2019, 11:33 | |
|
tagota, UC делаются тогда когда надо добавить новые свойства, новое поведение, но не тогда когда надо изменить представление.
Представление задаётся в XAML. Будете иначе - создадите гору костылей. В данном случае, у вас нет нужды в каких-то новых свойствах или поведении. Поэтому эта задача решается полностью в XAML через создания стиля/шаблона Посмотрите пример реализации контрола "Полигональная кнопка" в теме Кастомная кнопка в UserControl или UserControl со свойствами кнопки Там есть новые свойства для цветов кнопки в различных состояниях, для приёма делегата метода рисования полигона. Есть новое поведение - форма кнопки задаётся внешним делегатом. Но вся визуальная часть задаётся в XAML в шаблоне. Но даже это не совсем правильно, поскольку шаблон задаётся внутри UC. Он должен быть в отдельном ресурсе. Я не пишу вам не создавайте UC. Пишу - не злоупотребляйте. Всему своё место и время.
0
|
|
|
Модератор
|
|
| 29.11.2019, 11:47 | |
|
tagota, что касается нахождения ошибки.
То с целью обучения давайте попробуем. Для начала надо определить правильно создаются свойства и привязки. Для этот создайте новое окно для отладки кода. В нём создайте экземпляр вашего UC. Задайте привязки к его свойствам. Также в окно добавьте несколько TextBox которые привяжите к этим же свойствам. В результате вы сможете в окне увидеть состояние свойств UC. Привязки в TextBlock можно изменять в XAML прямо во время отладки окна. XAML во время отладки интерпретируется. Таким образом вы сможете как проверить тип значений сложных свойств. Так сможете и задать привязке вывод значений вложенных свойств или индекс элемента. Убедитесь что все добавленные свойства работаю правильно. После этого можно будет перейти к отладке представления.
0
|
|
|
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 86
|
|||||||||||
| 02.12.2019, 14:11 [ТС] | |||||||||||
|
Элд Хасп,
Итак, вот создал простенький контрол из пары текстбоксов.
(в текстбоксе отображается нужный текст; В комбобоксе нужные компоненты)
0
|
|||||||||||
|
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 86
|
||||||||||||||||
| 02.12.2019, 16:58 [ТС] | ||||||||||||||||
|
Элд Хасп, Таки заткнулся на моменте, когда пытался засунуть в другой комбобокс список, содержащий объекты моего класса (содержат string имя и bool флаг, выбран объект или нет")
Сам класс, который мы выше уже делали
P.S.S. в свойстве Fio установлен только геттер. А set не нужен? То есть я создал ещё одно свойство
0
|
||||||||||||||||
|
Модератор
|
|
| 02.12.2019, 18:23 | |
|
tagota, хоть мне очень не нравится такая реализация FIOWorkers, но будем разбираться с ней.
Свойство FIO только для чтения, поэтому у свойства только геттер. Значение такому свойству можно задать только в конструкторе типа. INPC нужен только если свойство IsSelected может меняться в нескольких местах приложения. Лучше перестраховаться и сделать его поддержку, чем потом, в случае чего, искать причину багов. Добавлено через 13 минут tagota, в ComboBox же надо задать шаблон элемента. Но даже без него должна выводиться коллекция, но все элементы в ней будут "FIOWorkers" - имя класса. Не выводится? Значит коллекция пустая. Или привязка неправильная. Для проверки задайте в UC TextBlock с привязкой к CollectionClassProperty.Count И посмотрите какое значение будет в нём. Если 0, значит неправильно заполнена коллекция. Если пустой - значит коллекция свойство null и по привязке ничего не пришло. Причину надо искать в заданной привязке. Добавлено через 1 минуту tagota, ещё совет. Привязки создавайте в конструкторе привязок. Это поможет избежать случайных ошибок.
0
|
|
|
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 86
|
||||||
| 03.12.2019, 11:52 [ТС] | ||||||
|
Элд Хасп, сделал, как Вы сказали, добавил
Сделал такую же проверку в основном окне приложения, с биндингом уже непосредственно к FIOWorkers во вьюмодели, с которой работаю, там он работает и показывает корректное количество элементов. Значит проблема в привязке, а куда копать, чтобы её выяснить? ещё заметил такой момент, что в XAML есть подчёркивание, типа ошибки и к ней сообщение "тип "ObservableCollection" не является коллекцией."
0
|
||||||
|
Модератор
|
||
| 03.12.2019, 14:17 | ||
|
tagota, давайте сначала проясним реализацию вашего UC.
В нём есть три DP свойства: . Все они реализованы по отдельности и ни как не связаны друг с другом. Для чего какое из них? Какой функционал они реализуют? В XAML, как я понял, три элемента: TextBlock привязанный к FirstStringProperty. ComboBox привязанный к CollectionProperty ComboBox привязанный к CollectionClassProperty Какие значения вы привязываете в окне к свойствам FirstStringProperty, CollectionProperty и CollectionClassProperty? Что из них отображается, а что нет в UC? Добавлено через 5 минут
После получения коллекции по привязке это предупреждение исчезнет. Чтобы не было таких ложных предупреждений, ошибок, исключений надо задавать контекст данных времени разработки. Контекст данных времени разработки значительно упрощает и ускоряет конструирование окон, страниц, UC. Уменьшает вероятность различных багов.
0
|
||
|
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 86
|
||||||
| 03.12.2019, 14:35 [ТС] | ||||||
|
Элд Хасп,
Этот MyUserControl я сделал тестовым. Набор элементов по сути выбирался для отладки. В первый текстбокс выводится обычный текст В первый комбобокс обычная коллекция с string элементами Во втором комбобоксе я уже попытался отобразить коллекцию с элементами классами, чего у меня и не вышло. То есть я пошагово хотел от простого к сложному разобраться во первых в правильности создания мною DP, и во вторых в чём ошибка была, когда делал привязку к коллекции с объектами класса. В основном окне все привязки работают, кроме той, что с коллекцией с объектами FIOWorkers. (ещё раз напомню, что если делать этот юзерконтрол не как отдельный контрол, а в той же xaml страничке, но просто кодом, который показал мсье sttrox, то всё работает, отображается, выбирается) В конце концов я хотел прийти к тому контролу, который хотел сделать изначально: комбобокс с чекбоксами и иметь у этого контрола два свойства: список всех элементов и список только выбранных элементов. что-то вроде такого:
0
|
||||||
|
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 86
|
||||||||||||||||
| 03.12.2019, 15:19 [ТС] | ||||||||||||||||
|
Элд Хасп, итак:
В самой программе во вью модели уже имеется string список всех фамилий workersHS_FIO, и исходя из него заполняется коллекция _workersHS_FIO из FIOWorkers объектов
В XAML странички привязка параметров в контроле выглядит так:
в первый комбобокс список строковых фамилий workersHS_FIO а второй комбобокс это уже то, что у нас не работает (комбобокс с чекбоксами с привязкой к _workersHS_FIO) ну и чтобы FIOWorkers был перед глазами, на всякий случай его продублирую сюда
0
|
||||||||||||||||
|
Модератор
|
|
| 03.12.2019, 16:32 | |
|
tagota, из скрина видно что коллекция в VM заполнена.
Теперь надо проверить привязки к UC. Добавьте в UC два TextBlock с привязкой к CollectionClassProperty и к CollectionClassProperty.Count. И скиньте что они вывели.
0
|
|
|
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 86
|
|
| 03.12.2019, 16:39 [ТС] | |
|
Элд Хасп, Добавил. ничего не вывели. На их месте просто пустота.
0
|
|
|
Модератор
|
|
| 03.12.2019, 17:31 | |
|
tagota, значит по привязке ничего не приходит.
Проверьте синтаксис ещё раз. Может где символ лишний или не в той раскладке. Добавлено через 3 минуты tagota, когда редактируете XAML UC, в конструкторе привязок видны добавленные свойства? Привязки создаёте через конструктор? Добавлено через 2 минуты tagota, и ещё рекомендация. У обычных свойств не должно быть окончания Property. Это окончание по соглашению зарезервировано за DP свойствами. Не думаю что дело в этом. Но измените названия - они сбивают с толку.
0
|
|
|
Модератор
|
|
| 04.12.2019, 08:17 | |
|
tagota, для проверки где "ломается" привязка в TextBlock который в окне задайте привязку не к свойству VM, а к свойству CollectionClassProperty вашего UC.
Если TextBlock отобразит данные, то значит "снаружи" в окне всё правильно - ошибка где-то "внутри" контрола.
0
|
|
|
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 86
|
|||||||
| 04.12.2019, 13:09 [ТС] | |||||||
|
Элд Хасп, Через конструктор привязок переделал все связи. По другому записались лишь привязки в чекбоксе, остальное по сути записывается точно так же, как и до этого я сделал руками.
то, что закомментировано - это как было. А теперь то, как оно выглядит после конструктора.
Привязал текстбокс в программе к свойству CollectionClassProperty - пусто. Немного поигрался с привязками внутри UC и понял, что проблема крутится именно вокруг CollectionClassProperty, потому что если привязать текстбоксы к обычной коллекции CollectionProperty, то отображается и её тип и количество элементов.
0
|
|||||||
|
Модератор
|
||||
| 04.12.2019, 13:57 | ||||
![]() Пишу со смарта - интеллектуальный ввод чудачит. А перепроверяю написанное не всегда. Пост сейчас исправлю. Добавлено через 3 минуты
Ищете в этом направлении. Добавлено через 16 минут
И связь между экземпляром и DP свойством устанавливается методом SetBinding класса DO. Кроме DP свойства мы создаём ещё для него оболочку из обычного свойства. Но в коде мы не сможем присвоить через эту оболочку привязку. Только просто значение. Чтобы не усложнять XAML для WPF принято соглашение. В XAML всегда обращаются по имени обычного свойства-обёртки. Но присвоение значений и привязок происходит через методы DP свойства, которое определяется как имя обычного свойства с добавлением в конец "Property". Это кстати и причина того, что в оболочке не должно быть ничего кроме Set и GetValue. Так как XAML обращается к DP свойству напрямую, не используя оболочку.
0
|
||||
|
1 / 1 / 1
Регистрация: 27.05.2015
Сообщений: 86
|
|
| 04.12.2019, 14:29 [ТС] | |
|
Элд Хасп, эхх даже и не знаю, что ещё можно сделать
![]() Возможно стоит переработать сам тип в UC и использовать не класс FIOWorkers, а как Вы ранее подметили обобщённые типы. Я правда ещё не имел опыта работы с ними, буду щас искать инфу что и как
0
|
|
| 04.12.2019, 14:29 | |
|
Помогаю со студенческими работами здесь
40
Кастомный контрол кривая линия Как сделать чтобы заработал кастомный контрол зума? кастомный checkbox CheckBox в ListBox. Как получить индексы выбранных элементов Кастомный item в listbox Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации:
В классе Работник добавить:
накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни
коэффициентПрезентеизма — снижает продуктивность. . .
|
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день.
Для работы необходим браузер,. . .
|
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности
Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано.
. . .
|
|
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
|
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива
Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
|
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так?
Да, всё верно. Я — искусственный интеллект.
Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
|
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает.
В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше.
Перед запуском проверяем. . .
|