WPF+MVVM часть 4/14 - Расширения разметки XAML, конвертеры, сервисы

YOUTUBE · 29.11.2025 03:54

Ключевые темы и таймкоды

Введение и цели

0:08
  • Приветствие и проверка звука.
  • Обсуждение проблем, возникших в прошлый раз.
  • Цель: разобраться с проблемами и улучшить архитектуру приложения.

Расширение разметки

2:07
  • Введение в расширения разметки в WPF.
  • Примеры использования: привязки, embedding, static resource.
  • Применение расширений для добавления недостающих элементов в разметку.

Конвертеры и свойства зависимости

4:06
  • Использование конвертеров для преобразования данных.
  • Введение в свойства зависимости и их роль в WPF.
  • Применение триггеров анимации и их влияние на свойства.

Проблемы с асинхронностью

7:02
  • Обзор кода из прошлого раза.
  • Проблемы с асинхронным и синхронным режимом работы.
  • Объяснение работы контекста синхронизации в WPF.

Решение проблем с асинхронностью

10:54
  • Решение проблемы с контекстом синхронизации.
  • Использование пула потоков для выполнения задач.
  • Тестирование и исправление ошибок в коде.

Заключение и дальнейшие шаги

15:16
  • Проверка работы кода после исправления.
  • Планы на дальнейшие улучшения и доработку приложения.
  • Введение в использование локейшн для корректного отображения данных.

Настройка свойств и удаление ненужных элементов

17:29
  • Удаление ненужных свойств и элементов.
  • Переход к view model для отображения стран на экране.
  • Удаление ненужных view models и коллекций.

Создание пользовательского элемента управления

25:50
  • Создание пользовательского элемента управления для отображения статистики.
  • Разметка представления с двумя колонками.
  • Добавление grid splitter для разделения экрана.

Настройка стилей и ресурсов

31:31
  • Создание стиля для grid splitter.
  • Настройка свойств ширины и высоты в зависимости от ориентации.
  • Подключение стиля на уровне всего приложения.

Подключение и тестирование представления

35:20
  • Подключение пространства имен для представления.
  • Тестирование представления и исправление скрытых элементов.
  • Настройка свойства z-index для отображения элементов.

Создание view model для статистики

38:55
  • Создание view model для статистики.
  • Связывание view models между собой.
  • Объявление data service и создание команд для загрузки данных.

Настройка команд и свойств

44:28
  • Создание команды для загрузки данных.
  • Объявление свойства для информации по странам.
  • Настройка приватного сеттера для свойства.

Добавление кнопки для загрузки данных

47:46
  • Добавление кнопки для загрузки данных в частичное представление.
  • Привязка кнопки к view model.
  • Настройка контекста данных для кнопки.

Использование отладочных данных

53:56
  • Создание отладочных данных для коллекции.
  • Использование отладочных конструкторов для визуализации данных в дизайнере.
  • Защита от ошибок при использовании отладочных данных.

Создание списка стран

56:50
  • Создаем список из 10 стран.
  • Проверяем загрузку данных и их корректность.
  • Добавляем свойство для выбранной страны.

Настройка отображения данных

1:01:05
  • Добавляем свойство для отображения информации о стране.
  • Используем конвертер для преобразования данных.
  • Создаем класс для конвертера, реализующий интерфейс IValueConverter.

Реализация конвертера

1:06:05
  • Создаем папку для конвертеров и класс PointToStringConverter.
  • Настраиваем методы конвертера для преобразования данных.
  • Объясняем работу методов конвертера и их параметры.

Использование конвертера

1:14:42
  • Компилируем и используем конвертер для отображения данных.
  • Обсуждаем проблемы с созданием множества привязок и решаем их.
  • Выносим конвертеры в статические ресурсы для оптимизации.

Пример использования конвертера

1:20:29
  • Создаем слайдер и текстовый блок для демонстрации.
  • Добавляем конвертер для изменения значения слайдера.
  • Реализуем конвертер для умножения значения на коэффициент.

Завершение реализации конвертера

1:31:58
  • Вводим свойства для коэффициента умножения.
  • Реализуем методы конвертера для умножения и деления значения.
  • Добавляем конструкторы для удобства использования конвертера.

Применение конвертера

1:35:38
  • Добавляем конвертер в ресурсы и используем его для слайдера.
  • Проверяем корректность работы конвертера и его влияние на значения слайдера.

Настройка слайдера и текстового блока

1:36:47
  • Настройка слайдера для изменения значения от 0 до 200.
  • Замена текстового блока на текстовый box для редактирования текста.
  • Добавление всплывающей подсказки с реальным значением слайдера.

Работа конвертера

1:37:44
  • Конвертер работает в обе стороны: от числа к строке и обратно.
  • Установка точек остановки для конвертера.
  • Пример конвертации значения слайдера в строку и обратно.

Создание базового класса конвертера

1:39:40
  • Создание базового класса конвертера с абстрактными методами.
  • Удаление тела виртуального метода и добавление исключения.
  • Подмена базового класса для поддержки обратного преобразования.

Линейный конвертер

1:42:27
  • Создание линейного конвертера для преобразования вещественного значения.
  • Добавление свойств для коэффициента и смещения.
  • Реализация прямого и обратного преобразования.

Использование ресурсов

1:46:03
  • Объяснение, как ресурсы объявляются на разных уровнях приложения.
  • Пример использования кисти как статического ресурса для экономии памяти.
  • Создание папки для базовых ресурсов и добавление кистей.

Заморозка объектов

1:52:54
  • Объяснение заморозки объектов для повышения быстродействия.
  • Использование расширения для заморозки объектов.
  • Пример заморозки объекта и его последствия.

Динамические и статические ресурсы

1:56:22
  • Различие между статическими и динамическими ресурсами.
  • Пример использования динамического ресурса для изменения оформления.
  • Ограничения динамического связывания для свойств зависимости.

Конвертеры и их типы данных

2:00:17
  • Объяснение работы конвертеров и их типов данных.
  • Проблема с подсказками в дизайнере при использовании конвертеров.
  • Решение проблемы с помощью атрибута "вершин вершин" для указания типов данных.

Преобразование типов данных

2:01:14
  • Методы конвертации могут возвращать разные типы данных.
  • Дизайнер может не ожидать определенных результатов от методов.
  • Преобразование типов данных может вызвать неожиданные результаты.

Метаданные и конструкторы

2:02:10
  • Среда разработки Visual Studio использует метаданные для анализа классов.
  • Метаданные помогают определить типы данных и отобразить подсказки.
  • Введение конструкторов для создания объектов без параметров.

Использование свойств и аннотаций

2:04:56
  • Свойства можно задавать в разметке.
  • Аннотации определяют метаданные для свойств.
  • Добавление атрибутов к свойствам может быть сложным.

Модификация метаданных

2:07:58
  • Можно добавлять атрибуты к классам на этапе runtime.
  • Модификация метаданных через тип дескриптор.
  • Добавление конвертеров между типами данных.

Использование статических ресурсов

2:10:36
  • Статические ресурсы могут использоваться в конвертерах.
  • Динамические ресурсы могут вызвать проблемы.
  • Пример использования линейного конвертера.

Композитные конвертеры

2:12:34
  • Композитные конвертеры позволяют комбинировать несколько преобразований.
  • Пример создания композитного конвертера с двумя методами.
  • Композитный конвертер вызывает другие конвертеры последовательно.

Мульти конвертеры

2:18:10
  • Мульти конвертеры используются с мульти привязкой.
  • Пример создания мульти конвертера для преобразования массива значений.
  • Пример использования мульти конвертера в разметке.

Расширение разметки

2:31:02
  • Расширение разметки позволяет создавать функции для разметки.
  • Пример класса, который возвращает массив чисел на основе строки.
  • Класс должен наследовать от класса ActionPack и реализовать метод OnAction.

Преобразование строки в массив

2:35:44
  • Разбиваем строку по разделителю, отбрасывая пустые элементы.
  • Парсим каждый элемент в целое число и превращаем в массив.
  • Возвращаем массив как результат работы метода.

Расширение разметки

2:37:43
  • Класс становится расширением разметки для преобразования данных.
  • Логика выполняется при формировании разметки.
  • Можно возвращать разные типы данных, указав атрибут markup extension to retain type.

Применение расширений разметки

2:40:35
  • Полезны в конвертерах, наследуя базовый класс от IMarkupExtension.
  • Конвертеры становятся расширениями разметки, что упрощает их использование.
  • Конвертеры создаются при каждом применении расширения разметки.

Композитные конвертеры

2:46:20
  • Композитные конвертеры также могут быть расширениями разметки.
  • Компонуем преобразования прямо в разметке.
  • Важно учитывать количество создаваемых конвертеров при использовании в списках.

Визуальные модели представления

2:50:39
  • Базовая модель представления становится расширением разметки.
  • Дизайнер не видит свойства модели, если не указать атрибут markup extension to retain type.
  • Доступ к окну изнутри модели возможен через сервис-провайдер.

Доступ к сервисам разметки

2:53:58
  • Сервис-провайдер позволяет получить доступ к параметрам разметки.
  • Используем мягкие ссылки для предотвращения утечек памяти.
  • Сохраняем ссылки на целевой объект и корень дерева разметки.

Настройка свойств для доступа к объектам

3:01:37
  • Создаем свойства для доступа к объектам через ссылки.
  • Проверяем корректность написания кода.
  • Извлекаем сервисы из контейнера и устанавливаем ссылки на окно.

Работа с weak references

3:04:58
  • View Model связана с окном слабыми ссылками.
  • Окно доступно через свойство, но не удерживается сборщиком мусора.
  • Возможность доступа к представлению изнутри модели.

Создание графика

3:07:43
  • Добавляем оси и настройки сетки для графика.
  • Выводим n-series график с суммарным количеством случаев по странам и датам.
  • Переопределяем виртуальные свойства для корректного отображения данных.

Настройка карты

3:21:54
  • Добавляем карту с использованием пакета Smolens.
  • Устанавливаем параметры карты и добавляем её в проект.
  • Декорируем карту и привязываем её к координатам страны.

Завершение и планы на будущее

3:36:46
  • Обсуждение использования сервера карт и лицензионной политики.
  • Планы на будущее: расширение разметки и управление зависимостями.
  • Призыв к вопросам и предложениям для будущих видео.