WPF+MVVM часть 5/14 - Инверсия управления, свойства зависимости, работа с потоками в UI

  Рет қаралды 11,572

Павел Шмачилин

Павел Шмачилин

Күн бұрын

Пікірлер
@1213-s8b
@1213-s8b 3 жыл бұрын
Бесконечное уважение автору за такой контент, ничего подобного в свободном доступе(а может даже и в закрытом доступе) не найти
@eswcpoker6562
@eswcpoker6562 3 жыл бұрын
Пока не покажут - не поймешь , пока свое не сделаешь - не научишься . Я наверное самый тупой , убив 4 дня что бы понять эти свойства зависмости и как их использовать . Спасибо !!! Контент очень качественный.
@Shmachilin
@Shmachilin 3 жыл бұрын
Ну в результате получилось разобраться?
@eswcpoker6562
@eswcpoker6562 3 жыл бұрын
@@Shmachilin с горем пополам со слезами на глазах )) , но это того стоило
@primuspares4462
@primuspares4462 2 жыл бұрын
Много слов благодарности хотелось бы написать...это как джеймс кэмерон в мире IT, в содружестве с гай ричи. Отдельное спасибо тому, кто сделал тайм код. Все, что надо, можно найти в этом курсе.
@ОлександрРижих-д5о
@ОлександрРижих-д5о 4 жыл бұрын
1:25 Начало. План урока 3:55 Обзор текущего кода 42:35 Инверсия управления и внедрение зависимостей 48:25 Подключение Microsoft.Extensions.Hosting 52:10 Создаем хост приложения 52:40 Создание точки входа в приложение 56:55 Написание метода создания хоста 1:20:25 Добавляем файл конфигурации appsettings.json 1:24:30 Применение инверсии управления для ViewModels 1:38:00 Перерыв 1:45:00 Конец перерыва 1:47:35 Создание интерфейса IDataService 1:52:45 Способы регистрации сервисов 2:05:20 Свойства зависимости 2:10:50 Создание пользовательского стрелочного индикатора 2:42:40 Превращение свойства в Binding объект 3:03:10 Настройка шаблона ReSharper 3:06:15 Конвертер с возможностью привязки данных 3:22:20 Отладочный конвертер для отладки привязок 3:32:40 Асинхронные операции 3:36:00 Упрощение процесса регистрации сервисов 3:41:10 Добавление элементов управления в UI 3:48:45 Логика реализации асинхронных операций 4:10:55 Логика реализации асинхронных операций в WinForms 4:18:55 Доработка модели представления для безопасной работы с потоками
@wastegate711
@wastegate711 3 жыл бұрын
ставлю лайк сразу перед началом просмотра. не понятно как участники стрима узнают, что будет стрим ни где не видел анонса.
@Shmachilin
@Shmachilin 3 жыл бұрын
kzbin.info/www/bejne/mn7Lop2Vr7Zgo5I
@MagistrTNT
@MagistrTNT 3 жыл бұрын
Это видео перевернуло мой мир!!! Спасибо!
@SergNeoSM
@SergNeoSM 3 жыл бұрын
Бесценный материал! Спасибо!
@konstantinewhite614
@konstantinewhite614 4 жыл бұрын
Круто! Спасибо за видосы!
@jamesford1363
@jamesford1363 4 жыл бұрын
круто! джеймс форд одобряет
@VyacheslavTamplier
@VyacheslavTamplier 3 жыл бұрын
Павел, подскажите пожалуйста еще такой момент... Зачем нужен базовый абстрактный класс Command? Можно же было все сделать в классе LambdaCommand, реализовав в нем интерфейс ICommand?
@Shmachilin
@Shmachilin 3 жыл бұрын
Здравствуйте! Можно. Если Вы ни на что не претендуете, если программа маленькая и перспектив не имеет, то можно. Иначе могут быть описаны специфические классы команд, которые не должны иметь в цепочке наследования LambdaCommand. В этом случае нужен базовый класс команды. Особенно он нужен если Вы создаёте библиотеку с инструментами для их многократного повторного использования.
@VyacheslavTamplier
@VyacheslavTamplier 3 жыл бұрын
@@Shmachilin понял. Спасибо!
@bonintimo
@bonintimo 3 жыл бұрын
ух... все... одолел эту часть... сил больше нет... хорошо, что лайк проставил заранее...
@Shmachilin
@Shmachilin 3 жыл бұрын
А то был бы дизлайк?
@bonintimo
@bonintimo 3 жыл бұрын
@@Shmachilin неееееее))) какой дизлайк? просто устал, сил нет - или лень ставить лайк, или забыл бы %) а если всерьез, то имхо 4 с половиной часа многовато для let"s code , лучше разбить на подчасти. это ж не игровой стрим, здесь думать нужно )
@yz777zhumabayev6
@yz777zhumabayev6 2 жыл бұрын
Здраствуйте а Вы смотрели Microsoft.Toolkit.Mvvm? // 49:27
@VyacheslavTamplier
@VyacheslavTamplier 3 жыл бұрын
Павел, здравствуйте, подскажите в чем особенность при создании свойства зависимости указывать nameof(Value), а не "Value". Также nameof бывает используется в OnPropertyChanged методе-обработчике события PropertyChanged. Какая принципиальная разница в его использовании, ведь при изменении имени свойства придется менять название и в строковом представлении и в nameof, т.к. и там и там оно жестко прописывается?
@Shmachilin
@Shmachilin 3 жыл бұрын
Здравствуйте! Если Вы делаете автоматизированный рефакторинг переименования средствами Студии, или РеШарпера, то инструмент найдёт все упоминания переименуемого члена везде в тексте программы лучше если будете писать nameof(...), нежели указывать его просто в кавычках.
@VyacheslavTamplier
@VyacheslavTamplier 3 жыл бұрын
@@Shmachilin спасибо за ответ.
@23tmsektant
@23tmsektant 2 жыл бұрын
Спасибо)Отличный контент)
@hisokamoro8189
@hisokamoro8189 5 ай бұрын
Отсутствует метод InitalizeComponent у app. Может кто подскажет, в чём дело?
@Shmachilin
@Shmachilin 5 ай бұрын
@@hisokamoro8189 а он там должен быть? Это же не окно.
@hisokamoro8189
@hisokamoro8189 5 ай бұрын
​@@Shmachilin, ну у Вас при создании хоста в Main есть...
@Shmachilin
@Shmachilin 5 ай бұрын
@@hisokamoro8189 Тут? github.com/Infarh/CV19/blob/be3ecc16b022a68fd7c4ba3399889ec31635ad1b/CV19/Program.cs#L13 Здесь github.com/Infarh/CV19/blob/be3ecc16b022a68fd7c4ba3399889ec31635ad1b/CV19/App.xaml.cs#L13 добавьте App : Application
@hisokamoro8189
@hisokamoro8189 5 ай бұрын
@@Shmachilin , да, там. У меня App наследуется от System.Windows.Application, но все равно не видит InitializeComponent
@hisokamoro8189
@hisokamoro8189 5 ай бұрын
@@Shmachilin , пытался нагуглить решение, удаление obj и bin, а потом пересборка не помогла.
@Saveaaa
@Saveaaa 3 жыл бұрын
А почему invocation_list через нижнее подчёркиванте?
@Shmachilin
@Shmachilin 3 жыл бұрын
Возможно, локальная переменная? Нет? Где именно?
@Saveaaa
@Saveaaa 3 жыл бұрын
@@Shmachilin не помню на какой именно минуте. У вас много таких переменных к примеру "data_points" , почему не dataPoints это как-то обусловлено? Её видно на 3:48:47
@Shmachilin
@Shmachilin 3 жыл бұрын
Потому, что это не Ява и не JS. Либо PascalCase, либо lower_case.
@Saveaaa
@Saveaaa 3 жыл бұрын
@@Shmachilin если посмотреть на coding conventions в документации к c# на оф сайте Microsoft , там такого именования вроде нет. По этому и спросил из-за чего так
@Shmachilin
@Shmachilin 3 жыл бұрын
Стилистика кодовой базы определяется конкретным сообществом. С недавних пор для этого даже конфигурационный файл добавили.
@aRRma99
@aRRma99 4 жыл бұрын
жесткая тема. мозг кипит.
@Shmachilin
@Shmachilin 4 жыл бұрын
Тема жёсткая. Согласен. Но после её осознания Ваш мир уже не будет прежним.
@viktornovikov9266
@viktornovikov9266 3 жыл бұрын
@@Shmachilin особенно, если пришёл с веба)))))
@TbIPDblM
@TbIPDblM Жыл бұрын
Только после этого видео понял почему в сервис передается интерфейс и объект который нужно получить >< Вопрос появился: после добавления своего хоста - запускаю приложение, после закрываю, а студия продолжает что то выполнять,
@Shmachilin
@Shmachilin Жыл бұрын
Это значит что ваше приложение не выгружено из памяти, и после закрытия главного окна оно по какой-то причине продолжает выполняться (главный поток не завершился).
@TbIPDblM
@TbIPDblM Жыл бұрын
@@Shmachilin дома выполнил все тоже самое и все работает 🤷‍♂️🧐
@Shmachilin
@Shmachilin Жыл бұрын
Очистить решение (удалить папки bin, obi) и почистить кеш Студии (удалить папку .vs).
@КонстантинШиряев-м6ж
@КонстантинШиряев-м6ж 4 жыл бұрын
Попробовал использовать свойства зависимости и получил массу вопросов. 1) Я обнаружил что свойство никогда не вызывается. public ICollectionView LogMessageCollection { get { throw new Exception("Вызов свойства зависимости LogMessageCollection"); return (ICollectionView)GetValue(LogMessageCollectionProperty); } set { throw new Exception("Вызов свойства зависимости LogMessageCollection"); SetValue(LogMessageCollectionProperty, value); } } Даже исключение пытался бросить, но вызова не происходит, а коллекция устанавливается. 2) Мне не понятно то, что при установке модели в контекст UserControl'а свойства зависимости отказываются работать. Думал пересекаются имена свойств зависимости и в модели, но нет. К тому же привязка св.зав. происходит к типу(как на видео - ItemsSource="{Binding LogMessageCollection, RelativeSource={RelativeSource AncestorType=local:LogGridControl}}")
@Shmachilin
@Shmachilin 4 жыл бұрын
Свойства-зависимости - это не обычные свойства. Это своего рода база данных значений параметров. Обычные свойства - это лишь костыль для упрощения их использования в коде. Основное их предназначение - это взаимодействие с механизмом Привязки. Поэтому обычные сеттеры не срабатывают при привязке.
@КонстантинШиряев-м6ж
@КонстантинШиряев-м6ж 4 жыл бұрын
@@ShmachilinПутем проб и ошибок понял что свойства зависимости устанавливают контекст данных того элемента от куда происходит привязка. То есть невозможно использовать и собственную вьмодель контрола и свойства зависимости одновременно.
@Shmachilin
@Shmachilin 4 жыл бұрын
Почему? Можно. Вы просто через свойства-зависимости как бы прикладываете некие данные к элементу. И к этому же свойству можно сделать привязку.
@РусланГаллямов-и9х
@РусланГаллямов-и9х 2 жыл бұрын
Я кажись знаю откуда и из-за чего много вопросов возникает по многопоточному программированию и WPF одновременно.... У меня та же причина, что и у многих.
@Shmachilin
@Shmachilin 2 жыл бұрын
Из-за чего?
@РусланГаллямов-и9х
@РусланГаллямов-и9х 2 жыл бұрын
@@Shmachilin Курсы. В том, который я прохожу дали задание на WPF приложение с многопоточностью. И другие люди, соответственно, тоже это задание получают.
@MrAlex1994
@MrAlex1994 Жыл бұрын
kzbin.info/www/bejne/d5ytZmWFaMian5I Если использовать using (var scope = App.Host.Services.CreateScope()) { var data = scope.ServiceProvider.GetRequiredService(); } Чтобы не было утечек нужно использовать IServiceProvider serviceProvider, который можно внедрить через конструктор в класс и инициализировать поле IServiceProvider _serviceProvider using (var scope = _serviceProvider.CreateScope()) { var data = scope.ServiceProvider.GetRequiredService(); }
@Shmachilin
@Shmachilin Жыл бұрын
И скрыть тем самым зависимости?
@MrAlex1994
@MrAlex1994 Жыл бұрын
@@Shmachilin Цели скрыть зависимости не стояло, стояла цель избавиться от утечек памяти, если знаете другой путь, как избавиться от утечек, напишите, пожалуйста. И спасибо за видеоуроки по WPF.
@Shmachilin
@Shmachilin Жыл бұрын
Причину утечки памяти Вы выяснили?
@MrAlex1994
@MrAlex1994 Жыл бұрын
@@Shmachilin Да. Мне нужен scope и если я получаю scope через App.Host.Services.CreateScope(), то память течет, а если scope получаю через serviceProvider.CreateScope(), то память не течет.
@MrAlex1994
@MrAlex1994 Жыл бұрын
Нашел у себя ошибку - у Вас все нормально. У меня просто каждый раз создавался Host в классе App, поэтому и были утечки.
WPF+MVVM часть 12.1/14 - База данных Entity Framework Core
3:29:54
Павел Шмачилин
Рет қаралды 14 М.
Counter-Strike 2 - Новый кс. Cтарый я
13:10
Marmok
Рет қаралды 2,8 МЛН
ВЛОГ ДИАНА В ТУРЦИИ
1:31:22
Lady Diana VLOG
Рет қаралды 1,2 МЛН
GRIDNET-OS -LIVE Development Stream
44:10
GRIDNET
Рет қаралды 5
Docker с 0 до 100%. Всё, что нужно знать.
5:08:24
[.net] - Тесты это не страшно
42:12
Андрей Фазлеев
Рет қаралды 226
Как устроен PYTHON
37:44
про АйТи | IT Pro
Рет қаралды 15 М.