|
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
|
||||||||||||||||
Отложенная загрузка ветвей TreeView через команды в MVVM09.04.2025, 14:42. Показов 3679. Ответов 32
Здравствуйте, помогите, пожалуйста, разобраться. Как сделать отложенную загрузку ветвей в TreeView.
Есть следующие классы сущностей (на названия не обращайте внимание изменены специально):
пробовал через тригеры привязаться к команде, но не получается получить именно TreeViewItem, чтобы взять из него необходимые данные
Нужно не только чтоб по событию вызывалась команда но еще и получить объект сам TreeViewItem чтобы по его Id загрузить дочерние элементы Есть еще вопрос по поводу съедает ли BitmapSource качество изображения, когда его создают из Bitmap?
0
|
||||||||||||||||
| 09.04.2025, 14:42 | |
|
Ответы с готовыми решениями:
32
WPF команды и MVVM. Часть 2. Всплытие команд. Реализация команды для списка элементов [WPF, Элд Хасп] Перебор всех ветвей в treeView
|
|
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
|
||
| 10.04.2025, 10:43 [ТС] | ||
|
А как в самом XAML указать, что есть какой-то обработчик для конкретной ветки HierarchicalDataTemplate ?
0
|
||
|
Модератор
|
||
| 10.04.2025, 13:14 | ||
|
Добавлено через 4 минуты
Как минимум стоит проверить сначала в Code Behind точно ли в этом проблема. А уже потом подумать как "красиво" это оформить. Но возможно в InvokeCommandAction даже есть возможность подписки на обработанные события. Я их редко использую и не могу точно сказать. Может можно сделать свой кастомный класс производный от InvokeCommandAction для подписки на обработанные события.
0
|
||
|
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
|
||
| 10.04.2025, 13:38 [ТС] | ||
|
0
|
||
|
Модератор
|
|
| 10.04.2025, 16:16 | |
|
Обсуждение качества отображения иконок перенесено в тему Конвертация Bitmap в ImageSource через массив байт делает изображение размытым
0
|
|
|
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
|
|||||||||||||||||
| 10.04.2025, 16:46 | |||||||||||||||||
|
Создать наследник и вывести наружу все события через команды.
Создать в VM команды ExpandComm и CollapseComm и привязать к xTreeView
0
|
|||||||||||||||||
|
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
|
||||||||||||||||
| 15.04.2025, 16:47 [ТС] | ||||||||||||||||
|
Решил попробовать через Behavior
сделал вот такой класс, чтобы добавить поведение для обработки события и выполнения команды:
0
|
||||||||||||||||
|
Модератор
|
||
| 15.04.2025, 17:55 | ||
|
Но я без компа. Просто читаю здесь код. Попробуйте для теста добавить в ItemContainerStyle EventSetter для Expanded с обработчиком в Code Behind.И посмотрите будет он вызываться или нет.
0
|
||
|
Модератор
|
|||||||||||||||||
| 16.04.2025, 02:12 | |||||||||||||||||
Сообщение было отмечено IIIIIIIIIgor как решение
Решение
1
|
|||||||||||||||||
|
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
|
|||||||||||||||||
| 16.04.2025, 09:05 [ТС] | |||||||||||||||||
|
Есть вопросы, чтобы понять для будущего: 1 - почему стали наследоваться от Behavior<TreeView> типизированным TreeView, а не TreeViewItem? 2 -
И еще вопрос дерево в окне не обновляется почему то. Команда срабатывает, все загружается (в памяти видно, что новые объекты в Children добавлены), но в окне ничего не появляется и даже треугольник для раскрытия ветки пропадает. хотя свойство Children это ObservableCollection и она должна уведомлять что она изменилась сейчас использую такую структуру:
0
|
|||||||||||||||||
|
Модератор
|
||||||||||||||
| 16.04.2025, 10:45 | ||||||||||||||
Сообщение было отмечено IIIIIIIIIgor как решение
РешениеTreeView.Это же проще чем задавать ещё и AttachedPeoperty для подписки на уровне TreeViewItem через сеттеры стиля. Большинство из них используют две стратегии: "Всплывание" - это когда событие последовательно вызывается от источника во всех его визуальных предках; "Туннелирование" - это когда событие последовательно вызывается от самого верхнего предка (обычно Окно) до элемента источника. Почти всегда такие событие именуются с префиксом "Preview". "Обычное" CLR свойство, которое есть в экземплярах элементов, это просто оболочка для упрощения обращения к RoutedEvent. Эта оболочка, по соглашению WPF, может отловить только необработанные RoutedEvent. Так же такая оболочка предоставляется только RoutedEvent "нужных" этому элементу (в большинстве случаев они и объявляются в этом же элементе). Но как я выше объяснял, через элемент проходят не только его события, но и все Всплывающие и Туннельные события всех дочерних элементов. Для подписки на обработанные события и события дочерних элементов, надо работать напрямую с RoutedEvent, а не через CLR оболочку. public ObservableCollection<TreeObject> Children { get; set; }. Поэтому если вы инициализируете это свойство после создания представления TreeObject, то представление не будет обновляться.Уберите сеттер из этого свойства чтобы избежать таких ошибок:
Так же для получения иконки "Expand" нужно чтобы в коллекции Children был хоть один элемент.Напрашивается:
Есть различные "хитрые" способы достичь желаемого. Но эти хитрости требуют и дополнительного кода, и подгонки под конкретную задачу.
1
|
||||||||||||||
|
3 / 3 / 0
Регистрация: 23.12.2016
Сообщений: 273
|
|||||||||
| 16.04.2025, 11:04 [ТС] | |||||||||
|
Сделал вот так:
Спасибо!
0
|
|||||||||
|
Модератор
|
||||||||
| 16.04.2025, 12:01 | ||||||||
|
Пишу здесь, поэтому воспринимайте код как концепт, а не рабочий вариант.
Но изменять (добавлять, удалять, заменять) итемы в этой коллекции можно.
0
|
||||||||
|
Модератор
|
|||||||
| 17.04.2025, 10:36 | |||||||
|
Биндинг отслеживает изменения свойств (в основном) по уведомлениям INPC. Что такое "изменение свойства (или поля)".... ну, это самые базовые знания по Шарпу. Для значимого типа - это присвоение нового экземпляра (значения). Для ссылочного типа - это присвоение ссылки на другой объект (или обнуление ссылки). Изменение свойств самих объектов (экземпляров) никак не влияет на свойство которое содержит ссылку на этот объект. Например, вот такое свойство:
SelectObject.Product = "Другой продукт", то привязка никак не узнает об этом и не обновится.То же самое с коллекциями (а все коллекции это ссылочные типы). Если есть свойство с коллекцией, то изменение самой коллекцией - это не изменение свойства с ссылкой на коллекцию. Для отслеживания за изменениями коллекции в WPF используется INCC (простая его реализация это ObservableCollection) и IBL (простая его реализация - это BindingList). В свойстве с такой коллекцией происходит "двойное" наблюдение. За изменением самого свойства (то есть записью в него новой коллекции) наблюдение происходит через INPC, а за изменением в самой коллекции наблюдение происходит через INCC или IBL. В вашей реализации вы использовали ObservableCollection. Но это "вторая" очередь наблюдения. Так как вы изменяли само свойство в котором была ссылка на эту коллекцию (создавали новый экземпляр коллекции и присваивали свойству), то для обновления Биндинга в этом свойстве должно было быть уведомление через INPC. Но в вашей задаче такое наблюдение избыточно. Поэтому можно просто сделать это свойство иммутабельным (только для чтения). В этом случае Биндингу достаточно один раз прочитать значение свойства и потом не наблюдать за его изменением. Биндинг читает свойство первый раз при загрузке элемента (событие Loaded). Поэтому, необязательно делать свойство только для чтения. Достаточно обеспечить чтобы его значение не менялось после загрузки элемента. Но такой вариант может повлечь случайные ошибки (как и было в вашем случае). Поэтому его следует использовать с большой осторожностью, ясно понимая его недостатки и какие преимущества такая реализация может дать в конкретной задаче.
0
|
|||||||
| 17.04.2025, 10:36 | |
|
Отложенная обработка событий Побочный эффект отложенной загрузки страницы (браузер перебрасывает пользователя в начало страницы) Нажатие на ветвь через Treeview и вывод в dataGridView Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|