Введение и цели 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 Обсуждение использования сервера карт и лицензионной политики. Планы на будущее: расширение разметки и управление зависимостями. Призыв к вопросам и предложениям для будущих видео.