WPF+MVVM часть 1/14 - Начало, архитектура проекта, основные элементы MVVM своими руками

  Рет қаралды 97,700

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

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

Күн бұрын

Пікірлер: 240
@arif1984may
@arif1984may Жыл бұрын
огромная благодарность! такие уроки на вес золота, а Вы бесплатно со всеми поделились знаниями, дай Бог Вам здоровья! Чтобы Вы встретили таких же добрых людей, как и Вы сами!
@someelse989
@someelse989 4 жыл бұрын
Какая редкость, контент на подобную тему, ну очень мало. Павел, спасибо!
@Shmachilin
@Shmachilin 4 жыл бұрын
Сам собирал по крупицам...
@uporka6924
@uporka6924 3 жыл бұрын
Согласен, давно искал что то подобное.
@hrandron
@hrandron 4 жыл бұрын
Я начинающий (пилю программу для управления и вывода данных на ПК из самодельного устройства). Столько перечитал инфу в инете, столько пересмотрел роликов на ютубе, но только у вас наконец-тось понял что такое привязка, как создавать команды. Спасибо.
@Николай-ш8ж4у
@Николай-ш8ж4у 4 жыл бұрын
Живешь такой, потихоньку ковыряешь C#, заказы на фрилансе небольшие делаешь по фану. Думаешь, "вроде как, я программист". Ага. Посмотрел 4 часа на одном дыхании, и понял, что тебя обоссали ))) Если без шуток, огромная благодарность за контент! Столько моментов раскрыто, доселе неведомых.
@Shmachilin
@Shmachilin 4 жыл бұрын
А сколько у меня таких моментов было с подобным ощущением... и сколько ещё будет...
@evilgamer2503
@evilgamer2503 Жыл бұрын
Это я когда на работу в ит пришел
@yanus174
@yanus174 4 жыл бұрын
2:20 Настройка студии VS 6:30 Настройка Visual studio code 14:25 Создание локального репозитория, и публикация в GIT 27:01 Создание инфраструктуры приложения MVVM 33:00 Пример MVVM приложений 40:00 Готовые Nuget пакеты MVVM 41:15 MVVM Prism 42:30 Базовый класс модели представления 51:00 Основная модель представления, для главного окна 51:55 Добавляем интерфейс IDisposable к классу ViewModel для примера реализации 1:01:30 Binding модели представления в xaml 1:46:00 Создание новой ветви из коммита 1:53:00 Создание кнопки MVVM 2:02:00 Базовый класс команды 2:09:00 Создание команды ЛямдаКоманд (Павел так ее называет) 2:17:00 описание команды в модели отображения 2:22:16 Определение отдельной команды 2:37:00 Привязка команд к объектам WPF, которые не поддерживают команды 2:42:00 Вынос команд в отдельные ресурсы 2:46:00 Иконки как шрифт (классная тема, если бы не увидел, не поверил бы) 2:58:00 Material Design 3:08:00 Http запросы 3:19:25 Построчное извлечение данных из источника, если объем информации большой 3:32:19 Извлечение данных в виде кортежа 3:47:08 Модели данных MVVM 3:53:00 OxyPlot WPF
@aRRma99
@aRRma99 4 жыл бұрын
Это реально шедевр!!! Самое лучшее что можно посмотреть по WPF+MVVM в ру сегменте!!
@dmitriialeksandrovich4565
@dmitriialeksandrovich4565 2 жыл бұрын
+++
@10011byrbon
@10011byrbon Жыл бұрын
В этом плейлисте чуть ли не 50 часов лекций. Столько материала, что аж страшно) Хочется все изучить, но так как новичок, то дается сложновато пока. Буду ковырять помаленьку, спасибо за такой контент.
@KonstantineWhite
@KonstantineWhite 4 жыл бұрын
Спасибо! Наверно лучший материал по данной тематике, по крайней мере в Ru-нете!
@ssayless
@ssayless 3 жыл бұрын
Полный курс по WPF с прекрасными сопровождающими комментариями, примерами, да еще и бесплатно! Год копаюсь в данной теме и это определенно лучший материал. Спасибо огромное за такой титанический труд!
@Shmachilin
@Shmachilin 3 жыл бұрын
Буду рад если Вам это пригодится и Вы, в свою очередь, научите этому кого-то.
@netaihelder
@netaihelder Жыл бұрын
@@Shmachilin aanssmAssad'ssaananrashassdnaads NVqamaskssans Asasnannnnnnnannnmnnnnn
@netaihelder
@netaihelder Жыл бұрын
7ga
@netaihelder
@netaihelder Жыл бұрын
7ga
@TheKanstantsin
@TheKanstantsin 4 жыл бұрын
Павел, огромнейшее спасибо и благодарность. Очень крутой материал! По данной тематике его вообще в принципе очень мало и практически невозможно собрать все в единое целое, а здесь все как на ладони, причем на открытой ладони, не зажато в кулачке)))))). Необыкновенная щедрость!)))
@Shmachilin
@Shmachilin 4 жыл бұрын
Пишите вопросы.
@fumbo9899
@fumbo9899 2 жыл бұрын
С такими знаниями, вам вполне можно создавать свои платные курсы по обучению людей. Код на высшем уровне)
@oldschool2445
@oldschool2445 3 жыл бұрын
Огромное спасибо! Очень крутой материал, аж голова распухла )) Вдумчиво разбирал лекцию 2 дня, чтобы всё запомнить и потренироваться. Буду смотреть следующие. Просто информационный клад.
@Shmachilin
@Shmachilin 3 жыл бұрын
У кого-то же хватает терпения всё это просмотреть...
@ЛенаЛесная-у5б
@ЛенаЛесная-у5б Жыл бұрын
@@Shmachilin Получаю огромное удовольствие, от души благодарю!
@bonintimo
@bonintimo 3 жыл бұрын
Просмотр ОТ и ДО, т.е. ВСЕ %) Лайк за работу!
@suiqrim
@suiqrim 3 жыл бұрын
Большое спасибо за целую серию очень полезных видео. Никак не мог понять патерн MVVM, но ваши видео очень помогли мне и я достаточно быстро освоился. Ещё бонусом к MVVM досталась настройка дизайна разных элементов WPF.
@argentmize
@argentmize 3 жыл бұрын
В кои-то веки ютуб нормальный ролик порекомендовал. Жаль только намного позже, чем это было нужно. Был вынужден начать с mvvm light, чтобы доделать программу, теперь вернулся к дефолтному wpf,и эти записи очень кстати, чтобы разобраться в кишках 😁
@VyacheslavTamplier
@VyacheslavTamplier 3 жыл бұрын
Павел, огромное спасибо за такой замечательный материал! На русском (да, и возможно, на английском) не найти такой подробный разбор паттерна MVVM в сети интернет, имхо. Также Вы довольно подробно разбираете другие аспекты разработки ПО, настолько комплексного подхода я еще не видел, и воды по минимуму, только самое необходимое с полезными отвлечениями! Продолжайте в том же духе и у Вас всегда будет благодарный слушатель-программист. По прошествии времени появился еще один момент, при котором программа сваливается в исключение. Появились регионы в названии которых тоже присутствует запятая, это - "Saint Helena, Ascension and Tristan da Cunha" и "Bonaire, Sint Eustatius and Saba", надо и их учитывать при парсинге csv-файла. Это для тех, кто столкнется с этой проблемой в настоящем и будущем.
@Shmachilin
@Shmachilin 3 жыл бұрын
По ходу надо отдельным стримом делать нормальный парсер csv.
@VyacheslavTamplier
@VyacheslavTamplier 3 жыл бұрын
​@@Shmachilin Вариант решения проблемы использовать регулярные выражения (может не лучший вариант, но рабочий). Добавить паттерн pattern, метод ParseStringCSV и немного изменить методы GetDates() и GetData(): private const string pattern = @",(?=\S)"; //..... private static String[] ParseStringCSV(string input, string pattern) => Regex.Split(input, pattern); private static DateTime[] GetDates() => ParseStringCSV(GetDataLines().First().ToString(), pattern) .Skip(4) .Select(s => DateTime.Parse(s, CultureInfo.InvariantCulture)) .ToArray(); private static IEnumerable GetData() { var lines = GetDataLines() .Skip(1); foreach (var line in lines) { var row = ParseStringCSV(line, pattern); var province_name = row[0].Trim(); var country_name = row[1].Trim(' ', '"'); var counts_many = row.Skip(4).Select(int.Parse).ToArray(); yield return (country_name, province_name, counts_many); } }
@ДмитрийДемин-ц1е
@ДмитрийДемин-ц1е 3 жыл бұрын
Внесу свои пять копеек. Огромное спасибо за такой материал. Понравилось, что вначале был разбор инфраструктуры проекта. Вообще, тема архитектуры это еще на целый стрим в 5 часов потянет). Еще раз благодарю.
@АртемРащепкин-ф4н
@АртемРащепкин-ф4н 3 жыл бұрын
Спасибо большое! Достаточно подробно, но о многом, с пояснениями и доходчиво! Большая благодарность!
@positivemoody
@positivemoody 3 жыл бұрын
Какой вы молодец проводить уроки по средствам трансляции в Ютубе.
@MagistrTNT
@MagistrTNT 3 жыл бұрын
Это лучшие видео по теме из всего , что я видел!!! Особое спасибо за науку по правильной организации структуры проекта.
@nikitaisyuk8630
@nikitaisyuk8630 3 жыл бұрын
Очень рад что нашел настолько подробное видео по данной теме. Спасибо!)
@ЯГречка
@ЯГречка 3 жыл бұрын
Вот просто спасибо, что ты есть, Павел! Спасибо, что ты создал канал на ютубе! Спасибо, что ты записал видосы по MVVM! 3 дня убил на то чтобы разобраться с тем как привязать коллекцию к DataGrid и просто вот сделал привязку к заголовку как ты и по альтернативе к коллекции и все чудесным образом заработало СПАСИБО!
@f.ingenia
@f.ingenia 3 жыл бұрын
Павел благодарю! Отлично всё объясняете. Очень полезное видео.
@xzenter
@xzenter 4 жыл бұрын
Большое спасибо! Лучший мастер класс и не только по MVVM! Ваш труд мне очень помог, желаю успехов.
@gredar77
@gredar77 3 жыл бұрын
Спасибо вам огромное. Много моментов, которые были непонятны при изучении построения приложений с помощью WPF в рамках MVVM, становятся ясны. Подача очень приятная.
@АлександрНиконов-и4ы
@АлександрНиконов-и4ы 3 жыл бұрын
Отличная подача материала. Спасибо!
@ВладимирЗаворотный-т4ж
@ВладимирЗаворотный-т4ж 3 жыл бұрын
Очень крутой вебинар! Собираюсь посмотреть все видео по wpf mvvm
@Blackfoxx797
@Blackfoxx797 3 жыл бұрын
Просто клад нашла!! Здорово. Спасибо. Разбираюсь в лекции) После разбора иду дальше смотреть
@alexkot9849
@alexkot9849 Жыл бұрын
Спасибо Дмитрий за Ваш урок!
@АлексДжаванов
@АлексДжаванов 4 жыл бұрын
Бро круто! лайк и подписка однозначно! не останавливайся
@Shmachilin
@Shmachilin 4 жыл бұрын
Благодарю!
@АлексДжаванов
@АлексДжаванов 4 жыл бұрын
@@Shmachilin Единственное с начала 3 часа понял что урок для новичка сложноват ( Просто повторяю не понимая зачем это делается... И даже не понимаю имеет ли смысл смотреть дальше при таком раскладе... Ибо инфа из за непонимание объемной картины в целом просто не усваивается (((
@Shmachilin
@Shmachilin 4 жыл бұрын
Есть такое. Скорее это для тех, кто уже не пугается конструкций языка, успел поработать с WinForms и слышал что такое паттерны проектирования.
@АлексДжаванов
@АлексДжаванов 4 жыл бұрын
@@Shmachilin посмотрев примеры попроще и со второго захода с осмыслением дошёл до 3 часа! Хочу сказать что контент бомба! На других видео либо умышленно, либо по незнанию упускаю много мелочей,. С тем же биндингом, Прям спасибо большое ещё раз за такую годноту !
@Shmachilin
@Shmachilin 4 жыл бұрын
@@АлексДжаванов задавайте вопросы! А то скучно...
@maxsoul757
@maxsoul757 2 жыл бұрын
вау, я наткнулся на потрясный контент, спасибо!
@23tmsektant
@23tmsektant 2 жыл бұрын
Спасибо за контент)Посмотрел пока что первую часть(и повторил конечно же её) Очень доступно рассказываете)
@Shmachilin
@Shmachilin 2 жыл бұрын
С csv проблем не возникло?
@23tmsektant
@23tmsektant 2 жыл бұрын
@@Shmachilin нет.Проблема была с графиком, т.к. последняя версия OxyPlot.WPF ,видимо , значительно отличается от той,что была на видео.Код с видео на ней у меня не работал. Поэтому я установил старую версию пакета м все заработало)
@vyachgusev
@vyachgusev Жыл бұрын
@@Shmachilin начал проходить ваши видео и как раз возникла ошибка "System.FormatException: "Unput string was not in a correct format" вот здесь "var counts = row.Skip(4).Select(int.Parse).ToArray();". Пока разобраться не удалось, в чем причина. Когда я полный 0, даже не удивляюсь..) Это тот момент, когда вы учите структурировать данные с гитхаба института
@vyachgusev
@vyachgusev Жыл бұрын
Все, почитал комментарии, увидел, что там добавились данные, все получилось! Мне бы такого препода, как вы! А то у меня вообще все тухло с этим. Приходится самообразованием заниматься. Через полгода сдавать тему по диплому, а я то одно то другое смотрю и пробую учиться. В итоге понимания в программировании никакого совершенно. Надеюсь, что после ваших уроков я все таки смогу, что нибудь сделать и не лопухнуться... Спасибо ВАМ огромное!
@remontunasdotru
@remontunasdotru 2 жыл бұрын
Спасибо вам за объяснение. Все кристально понятно!
@svetlanachernova9740
@svetlanachernova9740 2 жыл бұрын
Спасибо шикарное видео!!!! Очень полезное!
@АлексейНиколаев-й3к
@АлексейНиколаев-й3к Жыл бұрын
Шедеврально!!!!
@ГеоргийБарышников-п7т
@ГеоргийБарышников-п7т 3 жыл бұрын
Спасибо за ролик , только не прекращайте выпускать ролики 🙏
@yz777zhumabayev6
@yz777zhumabayev6 2 жыл бұрын
Спасибо за видео очень много интересного
@Serhii_lolovich
@Serhii_lolovich 4 жыл бұрын
Очень помогло понять mvvm, спасибо
@topProgrammer
@topProgrammer 3 жыл бұрын
Круто, спасибо за труд. Продолжай!
@BrooDRay
@BrooDRay Жыл бұрын
Огромнейшее спасибо за плейлист по WPF! Есть ли у вас аккаунт на бусти? Возможно кто-то захочет вас отблагодарить монеткой, если у них есть лишняя)
@mnocard
@mnocard 4 жыл бұрын
Очень круто! Спасибо!
@СергейШиповский-й2щ
@СергейШиповский-й2щ 3 жыл бұрын
Спасибо большое!
@Rueslan
@Rueslan 4 жыл бұрын
Действительно, хорошее изложение. Я ток начал учить мввм, это видео прям прояснило многие моменты. Но я понял что ничего не смыслю в программировании(
@Shmachilin
@Shmachilin 4 жыл бұрын
Когда-то я думал, что никогда и ни за что не буду программировать...
@PsychosocialBastard
@PsychosocialBastard 3 жыл бұрын
@@Shmachilin что изменилось?
@Shmachilin
@Shmachilin 3 жыл бұрын
Было время свободное и была книга (Delphi5 2000 год). Сел, вдумчиво прочитал... Потом был ВУЗ и вторая вышка по программированию.
@vyachgusev
@vyachgusev Жыл бұрын
@@Shmachilin а сколько вам лет, когда вы начали программировать? я правильно понял, что первая вышка была не по программированию?
@Shmachilin
@Shmachilin Жыл бұрын
@@vyachgusev Первая Вышка была по радиотехнике.
@betnews-8616
@betnews-8616 4 жыл бұрын
Вы очень круты!!! Спасибо большое!
@dmitriialeksandrovich4565
@dmitriialeksandrovich4565 2 жыл бұрын
Вы просто бог))
@animagnoa
@animagnoa 3 жыл бұрын
при установки компонентов в начале урока был момент с установкой компонента "Git для Windows" - если я поставлю этот пункт - инсталятор не по.ерит уже установленную ранее git систему поставленную с официального сайта git? или это совсем другое?
@Shmachilin
@Shmachilin 3 жыл бұрын
Вопрос хороший. Не пробовал. Обычно проблем с переустановкой Git в системе не возникало.
@McGewen
@McGewen Жыл бұрын
СУПЕР!!!!
@pavelkross
@pavelkross 3 жыл бұрын
Спасибо! очень годный контент
@Gifeest
@Gifeest Жыл бұрын
Здравствуйте, подскажите как самому создать шаблон для генерации кода? 56:44
@Shmachilin
@Shmachilin Жыл бұрын
Какого кода?
@Gifeest
@Gifeest Жыл бұрын
На 56:44 вы начинаете писать notyfprop, потом говорите что пока вручную, потом будете это делать автоматически. Вот именно этот шаблон как создать? @@Shmachilin
@viruslab1
@viruslab1 4 жыл бұрын
все четко ))) узнал кое что новое
@TheMilliardo
@TheMilliardo 4 жыл бұрын
Подскажите пожалуйсто как сделать команду для SelectedItem в ListView. А также если в также интиресует кнопка с коммандой внутри ItemTemplate listview что бы удалить выбраный по клику итем. В ListView нету Command для клика к сожелению(
@Shmachilin
@Shmachilin 4 жыл бұрын
Вы можете использовать для этого либо триггеры из библиотеки devblogs.microsoft.com/dotnet/open-sourcing-xaml-behaviors-for-wpf/, либо InputBinding thomaslevesque.com/2009/03/17/wpf-using-inputbindings-with-the-mvvm-pattern/
@someonewhoyoudontknowiguess
@someonewhoyoudontknowiguess 3 жыл бұрын
3:25:00 думаю здесь можно было использовать IAsyncEnumerable, тогда весь код был бы асинхронным.
@Shmachilin
@Shmachilin 3 жыл бұрын
Или IAsyncEnumetable?
@someonewhoyoudontknowiguess
@someonewhoyoudontknowiguess 3 жыл бұрын
@@Shmachilin Вот видишь, тяжело написать)
@Морпех-г2с
@Морпех-г2с 2 жыл бұрын
Стоит ли смотреть и пытаться понять эти уроки если опит работы с С# 3 месяца?
@ПетровичиК-м5у
@ПетровичиК-м5у 8 ай бұрын
Павел, а если панель контролов из wpf в winforms через user control и elementhost подрубить, то кнопки управления и слайдер из панели контролов также можно забиндить через viewmodelbase и inotifypropertychange? Делаю плеер на libvlc. Затормозил на этом моменте.
@Shmachilin
@Shmachilin 7 ай бұрын
Скорее всего да. У ElementHost есть свойство DataContext.
@ПетровичиК-м5у
@ПетровичиК-м5у 7 ай бұрын
@@Shmachilin Благодарю! надо попробовать. Тяжко c# дается если честно и просто времени не хватает на обучение.
@Shmachilin
@Shmachilin 7 ай бұрын
@@ПетровичиК-м5у Нужно больше практики и конкретных, полезных кому-то задач. И стараться уйти поскорее от WinForms.
@Ayub_Yaqub
@Ayub_Yaqub 2 жыл бұрын
Класс спасибо
@dreamr3371
@dreamr3371 4 жыл бұрын
Очень круто!
@HotCrusnic
@HotCrusnic 4 жыл бұрын
Можно ли во вьюмодели сделать проперти без явного объявления приватного поля?
@Shmachilin
@Shmachilin 4 жыл бұрын
Модно. Но работать будет не шипко быстро. Для этого объявляет либо в этом же классе, либо в базовом словарь, ключом которого будет имя Свойства, а значением - значение свойства. И делаете два protected-метода: GET и Set, обращающиеся к этому словарю.
@ВладимирЗаворотный-т4ж
@ВладимирЗаворотный-т4ж 3 жыл бұрын
С помощью каких инструментов вы рисовали графики в приложении для института 33:25?
@Shmachilin
@Shmachilin 3 жыл бұрын
OxyPlot
@Shmachilin
@Shmachilin 3 жыл бұрын
www.nuget.org/packages?q=OxyPlot.Contrib.Wpf
@максимевстюхин
@максимевстюхин 4 жыл бұрын
Огромное спасибо за видео!!! В используемом файле в колонке Province/State появилась запись "Bonaire, Sint Eustatius and Saba" пришлось добавить в строчку yield return line.Replace("Korea,", "Korea -").Replace("Bonaire,", "Bonaire -") Но получается теперь при добавлении в таблицу таких записей приложение будет падать Может кто нибудь знает как это исправить может с помощью регулярных выражений или еще как нибудь?
@Shmachilin
@Shmachilin 4 жыл бұрын
Переписать модуль разбора csv так, чтобы можно было в значениях использовать кавычки без костылей.
@АлексДжаванов
@АлексДжаванов 3 жыл бұрын
@@Shmachilin спасибо)) но вот ток кто бы знал как это сделать 😁😂
@Shmachilin
@Shmachilin 3 жыл бұрын
Регулярные выражения, готовые библиотеки для работы с CSV...
@АлексДжаванов
@АлексДжаванов 3 жыл бұрын
@@Shmachilin Павел хочу сам написать, но либо туповат либо мало опыта, 3 вечере голову ломаю, так и до конца не удалось сделать чтоб за работало)))
@АлексДжаванов
@АлексДжаванов 3 жыл бұрын
@@Shmachilin в итоге написал спустя дня 4 раздумий как это сделать😁 а щас смотрю и думаю вот я тугой, там же все очевиднее некуда))
@bexoldershow4343
@bexoldershow4343 4 жыл бұрын
Спасибо за видео, лучшее что есть про mvvm на русском языке!
@just4n4cc17
@just4n4cc17 4 жыл бұрын
Не подскажете, что делать, если нужно менять наполнение окна (весь грид) по логическому течению программы (будет несколько шаблонов грида для разных ситуаций, которые следуют одна за другой)?
@Shmachilin
@Shmachilin 4 жыл бұрын
Добрый день! Можно поступить следующим образом: в приложении в окне может быть назначена главная модель-представления. Одним из её свойств может быть дочерняя модель-представления, которую главная модель может менять по своему усмотрению. В разметке окна можно добавить элемент ContentControl, свойство которого Content можно привязать к свойству "дочерняя модель-представления" у главной модели окна. Также в ресурсах, на пример, окна надо объявить набор DataTemplate'ов, где у каждого шаблона указать тип той модели-представления, которую он должен отображать. Таким образом, при смене значения свойства "дочерняя модель-представления" ContentControl будет искать шаблон, который будет отображать нужный тип данных - по сути, нужное отображение дочерней модели-представления. При этом всё это будет работать быстро и эффективно в согласии с шаблоном MVVM.
@just4n4cc17
@just4n4cc17 4 жыл бұрын
@@Shmachilin Спасибо Вам огромное, все получилось. Отдельная благодарность за уникальный и качественный контент.
@oldschool2445
@oldschool2445 3 жыл бұрын
Немного не могу понять как менять свойства к которым мы делаем Binding из какого-нибудь метода, вот допустим свойство Status 1:50:20 которое тут показано, если я внутри своего метода создаю объект класса MainWindowViewModel vm = new(); далее устанавливаю свойству Status нужный текст vm.Status = "moy_text"; То при вызове этого метода сам текст в статус баре не меняется. Как правильно логикой менять значение свойств во ViewModel, чтобы элемент их сразу же отобразил после изменения.
@Shmachilin
@Shmachilin 3 жыл бұрын
А где и зачем Вы создаёте MainWindowViewModel?
@oldschool2445
@oldschool2445 3 жыл бұрын
@@Shmachilin Создавал экземпляр MainWindowViewModel чтобы через него задать свойству Status какое-нибудь нужное мне значение (но так не сработало). Как мне сделать чтобы мой метод мог менять это свойство, а статус бар который прибинден к этому свойству после этого так-же мгновенно обновлялся.
@Shmachilin
@Shmachilin 3 жыл бұрын
Вы не должны сами создавать эту модель. Её создаёт контейнер сервисов. Вам надо получить её экземпляр либо вытащив её из DataContext главного окна, либо из контейнера сервисов. Но скорее всего Вы в корне делаете что-то не так...
@oldschool2445
@oldschool2445 3 жыл бұрын
@@Shmachilin Вот смотрите для примера, я создаю новый класс class Testclass, в нём создаю метод TestMethod(), что мне нужно написать внутри моего TestMethod, чтобы изменить текст в статус баре, на какой-нибудь другой. (С учетом того что как в 1:50:20 у нас уже прибинден статус бар к свойству Status описанному в MainWindowViewModel
@Shmachilin
@Shmachilin 3 жыл бұрын
Ваш класс должен быть либо сервисом приложения, зарегистрированным в контейнере сервисов. Тогда в его конструкторе Вы сможете добавить параметр TestClass(MainWindowViewModel model). Либо Вам надо получить доступ к главному контейнеру сервисов и из этого контейнера достать модель-представления главного окна.
@andrevyakin
@andrevyakin 3 жыл бұрын
Спасибо за Ваш труд. Очень емко и информативно. Но решение в консольном проекте «yield return line.Replace("Korea,", "Korea -");» = костыль. Когда я изучал материал, в файле кроме Кореи появилась еще «Bonaire, Sint Eustatius and Saba» и все кранты. Вылетает с исключением. Полтора часа потратил, пока разобрался в чем дело и исправил 😊
@Shmachilin
@Shmachilin 3 жыл бұрын
Это не костыли. Это специально разложенные грабли!
@oldschool2445
@oldschool2445 3 жыл бұрын
Спасибо что написал в комментах, а то тоже после исключения полез сразу сюда посмотреть ))
@АлексДжаванов
@АлексДжаванов 3 жыл бұрын
А как исправили))? Дайте наводку))? Реплейс вначале через ковычки сделали почистили, а потом через запятую? Или сразу ковычки ловили через контейс и бегали от начальной до конечной, стирая/заменяя запятые?
@АлексДжаванов
@АлексДжаванов 3 жыл бұрын
@@oldschool2445 удалось исправить))?
@shagov25
@shagov25 3 жыл бұрын
рядом вот такие грабли положил) var i = 0; if (!int.TryParse(cell[4], out int res)) i = 1; var Counts = cell.Skip(4 + i).Select(int.Parse).ToArray();
@kirillkuznetsov159
@kirillkuznetsov159 3 жыл бұрын
Cпасибо!
@БлейрБурр
@БлейрБурр 2 жыл бұрын
Здравствуйте! Павел, подскажите, пожалуйста, я установил пробную версию решарпера, но, как я понял, там из коробки нет таких шаблонов, как notyfprop, цвета шрифтов другие и тд. Попытался покапаться в настройках, но их там настолько много, что голову сломаешь + еще расширения свои собственные. Можно ли как-то Ваши настройки решарпера получить или видео небольшое запилить по его возможностям?
@БлейрБурр
@БлейрБурр 2 жыл бұрын
Всё, спасибо, нашел в 3 части от Павла ссылку на шаблоны Мало ли у кого такой же вопрос возникнет: "Да. Скачать шаблоны можно отсюда: github.com/Infarh/CV19/files/5629522/ReSharper.Templates.zip"
@enderhexfyreeve1900
@enderhexfyreeve1900 3 жыл бұрын
как-то не получается добавить солюшн с несколькими проектами как это сделано на видио. у меня такое предупреждение: your solution contains files outside the solution folder which will not be included. затем если предупреждение проигнорить то папки гита создасца в проекте, а не в папке солюшн. что с этим можно сделать? и на 14:26 окошко по-другому выглядит. нет "отправить в github" хотя учетная запись гитхаба прикреплена. подскажите, что там надо в настройках поменять? vs studio 2019 16.10.0.
@Shmachilin
@Shmachilin 3 жыл бұрын
Галку не ставили при создании решения что бы размещать проект в папке решения?
@enderhexfyreeve1900
@enderhexfyreeve1900 3 жыл бұрын
@@Shmachilin точно. в ней и была проблема. она сама по умолчанию была. а как сделать чтобы кнопка публикации на гитхаб была в тимэксплорере как на видио? у меня публикация только через раздел меню git работает. в принципе не так важно откуда публиковать, но может если подскажете, то лучше пойму настройки студии.
@TheDisJarpTV
@TheDisJarpTV 2 жыл бұрын
Действительно очень позновательно, это огрномный труд. Хотелось узнать только момент по поводу привязки команд. Дело в том что я искал решени кросплатформеных приложений на C#, и так получилось что начал изучать avalonia framework, который мне понравился. Так же он практически не отличается от WPF поэтому решили на основе ваших вебинаров разработать тестовое приложение на avalonia. И на моменте создания команд я не до конца понял для чего так сильно мучаться с интерфейсами, если можно привязать к обычным методам. Или это работает только на avalonia? И очень хотел бы узнать ваше отношение к данному framework, не будет такой ли вероятности что вы запишити курс по нему?
@Shmachilin
@Shmachilin 2 жыл бұрын
Здравствуйте! Avalonia не смотрел... Времени не было. Но скорее всего идеи в нем те же. Что же касается интерфейсов, то это обеспечивает большую гибкость в использовании.
@АлексДжаванов
@АлексДжаванов 4 жыл бұрын
Павел а в самом конце в упоминаете о чтате в телеге что за чат )? в него можно попасть )?
@Shmachilin
@Shmachilin 4 жыл бұрын
@GB_CSharp
@АлексДжаванов
@АлексДжаванов 3 жыл бұрын
@@Shmachilin павел нет такого канала или группы ( во всяком случаи в поиске ее не выдает ) возможно закрыта в настройках приватности с приглашением по ссылки ((
@BraentR
@BraentR 2 жыл бұрын
Спасибо
@alexandrvint7098
@alexandrvint7098 2 жыл бұрын
Павел, подскажите пожалуйста, где можно основательно изучить технологию WPF с применением шаблона MVVM? В книгах очень все скудно, особенно с DataGrid.
@Shmachilin
@Shmachilin 2 жыл бұрын
В своё время я по Метанит и professorweb.ru изучал. Но с книгами по этому делу (на русском) беда - да...
@АлексДжаванов
@АлексДжаванов 4 жыл бұрын
Павел а можете подсказать почему Binding не видит комментарии ? у вас на видео Они видны, или это все решарпер а стандартными средствами видимость ограничена в пределах кассового наследования ?
@aRRma99
@aRRma99 4 жыл бұрын
Да стандартный редактор VS убогий и много чего не показывает. Ставьте решарпер.
@АлексДжаванов
@АлексДжаванов 4 жыл бұрын
@@aRRma99 дак решарпер денежки просит 😎
@aRRma99
@aRRma99 4 жыл бұрын
@@АлексДжаванов на торрент загляните
@АлексДжаванов
@АлексДжаванов 4 жыл бұрын
@@aRRma99 серьезно ))?
@Shmachilin
@Shmachilin 4 жыл бұрын
Тяжёлые наркотики покупать только у дилера!
@SergNeoSM
@SergNeoSM 3 жыл бұрын
Спасибо огромное за ваши труды. Лучший материал на русском языке!
@antonkulikov6726
@antonkulikov6726 4 жыл бұрын
Уроки топовые. Есть пара вопросов: а что если UI у нас на wpf ,а вью модель на C++/cli. Причем проект сам на C++,а UI на wpf как dll ка подключается к проекту на C++/CLI. Будет ли в dll класс application,или может его можно как-то создать,через расширения разметки? Вью модель придется установить явно окну через. Data context? Спасибо!
@Shmachilin
@Shmachilin 4 жыл бұрын
У Вас есть интерфейс пользователя (UI) - визуальная часть. А также может быть что угодно в любой форме написанное хоть на C++, хоть на Delphi, хоть веб-сервис. Для приложения это всё можно выделить в понятие "модели". И для того чтобы "подружить" "модель" с UI можно взять "модель" и обернуть её в оболочку - модель-представления. Давно принял для себя стратегию поведения: если что-то не получается сделать "в лоб", то надо уходить в абстракцию добавляя новую оболочку которую я могу контролировать. Создать класс-модель поведение которого я могу определить так как мне надо и внутри этого класса уже выполнить управление над тем объектом, который надо контролировать. А снаружи я получу интерфейс моего класса в том виде, в котором он мне нужен. (Паттерн Фасад это вроде бы я "изобрёл" в своё время). Также и тут. Если у Вас есть какая-то вью-модель, но она Вас по каким-то причинам не устраивает, то создавайте над ней оболочку - ещё одну вью-модель и уже эту модель-представления передавать в UI.
@antonkulikov6726
@antonkulikov6726 4 жыл бұрын
@@Shmachilin да . Именно так я и делаю. А можно ли класс application в dll на wpf в таком случае(например в вызове управляемого кода на C# из неуправляемого на C++) определить (то есть именно в dll-ке)?
@Shmachilin
@Shmachilin 4 жыл бұрын
Нет ничего невозможного. Вопрос лишь в числе граблей на которые потребуется для этого наступить. Вот только зачем? Зачем тащить интерфейс внутрь логики?
@antonkulikov6726
@antonkulikov6726 4 жыл бұрын
@@Shmachilin тут такое дело... Есть проект на c++,с кучей легаси. К сожалению qt использовать нельзя. Поэтому в плане интерфейса выбора не так уж и много:либо mfc,но это та ещё боль. Либо wpf, но приходится как раз создавать абстракцию в коде c++/cli вью модель, которую и подсовывать ее. Вот такой вот колхоз...
@Shmachilin
@Shmachilin 4 жыл бұрын
А главным запускаемым проектом должен быть обязательно проект на c++?
@feitan8745
@feitan8745 4 жыл бұрын
Здравствуйте, вы можете добавить субтитры к своей серии MVVM?
@Shmachilin
@Shmachilin 4 жыл бұрын
Здравствуйте! Пока наверное нет... не готов.
@TheMilliardo
@TheMilliardo 4 жыл бұрын
Подскажите пожалуйсто как забиндить TextBox к свойству типа double с UpdateSourceTrigger=PropertyChanged? При PropertyChanged не получаеться искользовать "точку". Я нашел где то решение на 3-4 класса ... Может быть есть что то по проще и короче?
@Shmachilin
@Shmachilin 4 жыл бұрын
Есть такой костылик: добавить небольшую задержку на ввод следующей за точкой цифры. Text="{Binding TestValue, UpdateSourceTrigger=PropertyChanged, Delay=100}" Если пользователь не успеет за 100мс ввести цифру, следующую за точкой, то значение из свойства TestValue перечитано и точка будет отброшена. Задержку можно подобрать так как будет удобно.
@Юрчик-л8у
@Юрчик-л8у 2 жыл бұрын
момент с textbox ,почему то он не в какую не менялся ,ненаписать не удалить что в нем
@Shmachilin
@Shmachilin 2 жыл бұрын
Где именно?
@Юрчик-л8у
@Юрчик-л8у 2 жыл бұрын
@@Shmachilin это уже вроде особо не нужно ,но сейчас пытаюсь кнопками влево вправо переключать ,не получается.Хотя вроде бы все прописал
@Saveaaa
@Saveaaa 4 жыл бұрын
У меня 2 вопроса. В приложении главное окно, в котором реализованно переключение между 5 пейджами. в каждом page по 2 listView и 1 datagrid , 3 диалога для добавления данных , 1 для вывода сообщений, плюс поля для отображения доп информации при выборе какой либо строки, диалог на удаление, сюда же biningи visibl и enable и на selectValue. Так вот это тонна биндингов и переменных. такая тонна, что уже кажется , что что-то пошло не так и это бред. Это норм для mvvm с сложным ui? Если это можно назвать сложным. Или я что то не так делаю? И второй вопрос- у вас в программе для самолётов было много окон , которые зависили от графика и информация в них отображалсь исходя из графика. Как и наоборот когда вы нажимали на плей на окне с приборами все начинало двигаться, включая график. Как это реализованно? Это дочерние окна?
@Shmachilin
@Shmachilin 4 жыл бұрын
Добрый день! Вы можете разбивать представление на вложенные элементы - выделять повторяющиеся части в отдельные компоненты. И да, привязок там может быть очень много. А в том приложении есть объект плеер, который "двигает" время, есть объект "сервер индикации", который ловит изменения времени в плеере (обрабатывает событие), читает данные из контейнера значений и отсылает данные клиентам. Клиенты имеют набор свойств к которым привязываются визуальные индикаторы.
@Saveaaa
@Saveaaa 4 жыл бұрын
@@Shmachilin когда открывается новое окно с клиентом . Вы туда передаете DataContext ? Или как новые окна получают увеломления о событиях или новые данные?
@Shmachilin
@Shmachilin 4 жыл бұрын
Когда открывается новое окно, то для него создаётся его собственная модель-представления. Модель-представления дочернего окна может подписаться на события модели-представления родительского окна. Либо модель-представления родительского окна может сохранить себе ссылку на модель-представления дочернего окна и передавать ей данные.
@Saveaaa
@Saveaaa 4 жыл бұрын
@@Shmachilin понятно, спасибо
@Shmachilin
@Shmachilin 4 жыл бұрын
Отпишитесь по результатам.
@eatpasta9763
@eatpasta9763 6 ай бұрын
Наконец-то наткнулся на клад!
@oliviacolins6856
@oliviacolins6856 4 жыл бұрын
Подскажите, каким образом можно отобразить данные в реальном времени не перезапуская программу? т.е. есть БД откуда берутся данные и отображаются в программе в момент запуска программы. Как только в БД попадают новые данные из вне, приложение их не отображает. Только при перезапуске программы... Подскажите, как можно сделать чтоб при изменение значений в БД, сразу это отображалось в программе?
@Shmachilin
@Shmachilin 4 жыл бұрын
А к БД Вы как подключаетесь? Что мешает сделать кнопку/таймер и выполнить эту процедуру вновь в процессе работы программы и загрузить данные снова?
@oliviacolins6856
@oliviacolins6856 4 жыл бұрын
​@@Shmachilin Спасибо, вроде на данном этапе разобралась. А так подключалась через EntityFramework, проблема была что получала от EntityFramework те же данные, а не обновленные и сделала кнопку обновить, как вы рекомендовали. Теперь думаю как реализовать все это дело через таймер, потому как не хочу получать данные при клике на кнопку обновить. Спасибо за очень ценный материал.
@damascake
@damascake 2 жыл бұрын
Ставь лайк, если ты на 3:40:00 тоже кричал автору в монитор, что он уже распарсил строку, у него уже массив, кавычки можно удалять.
@alexandrsharp920
@alexandrsharp920 3 жыл бұрын
а какие у вас дополнения для студии ? в частности внизу что то похожее на счетчик ресурсов
@Shmachilin
@Shmachilin 3 жыл бұрын
Справа снизу информацию выводят РеШарпер и PerfWatson Mon marketplace.visualstudio.com/items?itemName=PaulHarrington.PerfWatsonMonitor-9621
@alexandrsharp920
@alexandrsharp920 3 жыл бұрын
@@Shmachilin спасибо!
@abrajmek_zalilov
@abrajmek_zalilov 2 жыл бұрын
Здравствуйте, автор! Спасибо за Ваши старания. Подскажите пожалуйста, на сколько это всё актуально на сегодня, ведь sdk уже и 5.0 и 6.0 уже существуют... Надо ли мне обязательно и 3 версию ставить?
@Shmachilin
@Shmachilin 2 жыл бұрын
Здравствуйте! Всё актуально. Используйте последнюю версию Visual Studio и SDK .Net
@abrajmek_zalilov
@abrajmek_zalilov 2 жыл бұрын
@@Shmachilin спасибо за оперативный ответ! Перехожу из вэба на C# и десктопные приложения, хочу заниматься разработкой VST и другой работой со звуком. Нашёл Ваш канал, он как никогда кстати. Хороший вход... Уж не Гоша Дударь, прости г-ди.
@vyachgusev
@vyachgusev Жыл бұрын
@@Shmachilin я только сейчас присоединяюсь к прохождению ваших нереально крутых образовательных видео! а если уже .net 8.0 есть? его можно использовать? и спасибо за уроки! гоша дударь курит в сторонке...
@Shmachilin
@Shmachilin Жыл бұрын
@@vyachgusev там концептуально ничего не поменялось. Синтаксис интереснее стал.
@rdragon587
@rdragon587 Жыл бұрын
Cool
@hikkathon
@hikkathon 4 жыл бұрын
Пытался сделать свою команду "Свернуть окно приложения"(MinimizedApplicationCommand) для практики, не вышло( на прямую в xaml окна всё получается this.WindowState = WindowState.Minimized; а через команду не могу сообразить как хD
@Shmachilin
@Shmachilin 3 жыл бұрын
Надо смотреть как Вы пытались её сделать... Надо либо ссылку на ГитХаб, либо хотя бы фрагмент кода. Иначе там много что может пойти не так.
@josbexerr5166
@josbexerr5166 3 жыл бұрын
Gracias Mister....saludos de los andes peruanos.... la próxima activa el subtitulo....
@ЛинарГайнутдинов-т2э
@ЛинарГайнутдинов-т2э 3 жыл бұрын
Добрый день! Я просмотрел половину видео и местами бывает не совсем понятно. Хотелось бы узнать для людей с каким уровнем знаний рассчитан данный урок? И достаточно ли будет этих знаний, чтобы трудостроиться в IT компанию ?
@Shmachilin
@Shmachilin 3 жыл бұрын
Здравствуйте! Ну как минимум требуется уметь отличать абстрактный класс от интерфейса и знать базовое представление о паттернах проектирования (что они хотя бы есть...) Достаточно ли этого будет для трудоустройства сказать сложно.
@shlm3650
@shlm3650 4 жыл бұрын
Как сделать отдельную команду "ChangeTabIndexCommand" , что бы можно было через "Window.Recources" ?
@Shmachilin
@Shmachilin 3 жыл бұрын
У команды есть параметр. Можно передать TabControl в качестве параметра.
@Андрей-ы7ю4х
@Андрей-ы7ю4х 3 жыл бұрын
Подскажите, пожалуйста, есть ли исходники RRG-Express?
@Shmachilin
@Shmachilin 3 жыл бұрын
Исходники есть.
@Андрей-ы7ю4х
@Андрей-ы7ю4х 3 жыл бұрын
@@Shmachilin можете дать ссылку, пожалуйста? Очень заинтересовали некоторые функции, хочется посмотреть на реализацию)
@Shmachilin
@Shmachilin 3 жыл бұрын
Ссылку дать не могу. Коммерческий продукт ГСС. Могу ответить на вопросы.
@vanovano9056
@vanovano9056 3 жыл бұрын
Когда команда CloseApplicationCommand определена как класс в отдельном файле, то как ресурс она объявляется Как объявить ее ресурсом если она определена в ViewModel? Спасибо.
@Shmachilin
@Shmachilin 3 жыл бұрын
Если она часть модели-представления, то зачем её надо "закреплять" в ресурсах? Есть ведь модель-локатор...
@vanovano9056
@vanovano9056 3 жыл бұрын
@@Shmachilin Если команда объявлена как отдельный класс, то экземпляр команды создается для каждого упоминания ее в разметке, чтобы этого не произошло мы используем ее как ресурс, т.к. в этом случае экземпляр команды создастся единожды. Когда команда часть ViewModel, то созданием команды рулим мы сами, создаем ее в конструкторе 1 раз. Правильно я понял?
@Shmachilin
@Shmachilin 3 жыл бұрын
Через разметку никак. В коде - можно в ресурсы добавить что угодно. Один вопрос: а зачем?
@vanovano9056
@vanovano9056 3 жыл бұрын
@@Shmachilin Сейчас вопрос зачем уже не стоит. Сразу после просмотра это было не совсем понятно ;)
@АнонАнон-щ3э
@АнонАнон-щ3э 3 жыл бұрын
а почему поля классов с большой буквы? Просто такой стиль написания кода? Просто вроде общепринято с маленькой обозначать
@Shmachilin
@Shmachilin 3 жыл бұрын
Для имён перечислений, структур, делегатов, классов, членов классов (полей, свойств, методов), а также входных переменных метода принят PascalCase. Для локальных переменных - lower_case. camelCase - это стиль Java.
@АнонАнон-щ3э
@АнонАнон-щ3э 3 жыл бұрын
@@Shmachilin спасибо, я просто смотрел и другие c# уроки, везде не много по разному
@kavelquu
@kavelquu 3 жыл бұрын
@@Shmachilin эм нет, во всех coding conventions (в том числе и от самих microsoft) lower_case никогда не использовался в C#. В C# используют только PascalCase и camelCase, lower_case нет
@TbIPDblM
@TbIPDblM 2 жыл бұрын
Технически все понятно, но я ахаюсь только с одним пунктом, делаю все как по видео создаю WPF проект, создаю реп заливаю на гитхаб, но при добавлении /Tests/ WPF и консольного проектов, их не видит гит (и в дальнейшем работая на др компе при получении реп папка tests пустая), либо они отображаются в проекте основном.
@Shmachilin
@Shmachilin 2 жыл бұрын
Галочку поставили в диалоге создания первого проекта о размещении всех файлов в одном каталоге? Ссылку на ГитХаб репозиторий дайте посмотреть.
@TbIPDblM
@TbIPDblM 2 жыл бұрын
@@Shmachilin не ставил 😬🫤завтра свежим взглядом погляжу, спасибо 🫡
@Shmachilin
@Shmachilin 2 жыл бұрын
@@TbIPDblM ссылку скиньте.
@TbIPDblM
@TbIPDblM 2 жыл бұрын
@@Shmachilin разобрался, при создании у меня первого проекта файл решения там же располагался, галочку снял, и все стало ок
@Shmachilin
@Shmachilin 2 жыл бұрын
Теперь и Вы знаете о этих граблях. Я бы руки оторвал тому кто эту галочку там разместил.
@amoe4333
@amoe4333 4 жыл бұрын
Делаю все тоже самое но на моменте записи MainWindowViewModel: ViewModel выходит ошибка ''ViewModel" является пространство имен, но используется как тип." Не могу понять почему P.S Бред. Создал новый проект, все работает, а в старом почему-то нет... Ох уж этот visualstudio.
@Shmachilin
@Shmachilin 4 жыл бұрын
По всей видимости у Вас пака, в которой лежат модели-представления, называется "ViewModel", а не "ViewModels". В результате было создано пространство имён "ViewModel" (в единственном числе), совпадающее с именем класса.
@ДмитрийСкареднов-н8р
@ДмитрийСкареднов-н8р 2 жыл бұрын
WPF жив? Если да, то наверно сплошное легаси?
@Shmachilin
@Shmachilin 2 жыл бұрын
Вы с чего взяли?
@ДмитрийСкареднов-н8р
@ДмитрийСкареднов-н8р 2 жыл бұрын
@@Shmachilin я не знаю, вот и спрашиваю
@Dorin-Baba
@Dorin-Baba 4 жыл бұрын
@뽓따나
@뽓따나 Жыл бұрын
😀I'm enjoying watching KZbin. foreach (var row in lines) { var province = row[0].Trim(); var country_name = row[1].Trim(' ', '"'); var counts = row.Skip(4).Select(Int32.Parse).ToArray(); //ERROR yield return (country_name, province, counts); } ERROR : System.FormatException:'input string was not in a correct format" What's the cause?
@Pincne
@Pincne Жыл бұрын
Hi, It is necessary to exclude a number of countries that fall out of the general view when selecting a row private static IEnumerable GetDataLines() { var data_stream = GetDataStream().Result; var data_reader = new StreamReader(data_stream); while (!data_reader.EndOfStream) { var line = data_reader.ReadLine(); if (string.IsNullOrWhiteSpace(line)) continue; yield return line.Replace("Korea,","Korea -").Replace("Bonaire,", "Bonaire -").Replace("Helena,", "Helena -"); } }
@wastegate711
@wastegate711 4 жыл бұрын
На рабочем столе заставка из Eve Online.
@Shmachilin
@Shmachilin 4 жыл бұрын
Nemesis
@mvzex
@mvzex 3 жыл бұрын
52:00
@maxm1079
@maxm1079 3 жыл бұрын
качественный материал, то что есть на itdvn невозможно слушать из за зелености самого доклачика и не поставленного голоса.
@wasknocked
@wasknocked 4 жыл бұрын
Стыдно - ничего не делать!!
@sergeyzaboryev
@sergeyzaboryev 4 жыл бұрын
И назовём его CV-19. Мне одному это кое-что напоминает?
@Shmachilin
@Shmachilin 4 жыл бұрын
Что на пример?
WPF+MVVM часть 2/14 - Стили, шаблоны, триггеры
3:51:22
Павел Шмачилин
Рет қаралды 28 М.
Chain Game Strong ⛓️
00:21
Anwar Jibawi
Рет қаралды 41 МЛН
So Cute 🥰 who is better?
00:15
dednahype
Рет қаралды 19 МЛН
Don’t Choose The Wrong Box 😱
00:41
Topper Guild
Рет қаралды 62 МЛН
Путин ответил на ультиматум Трампа
7:25
Diplomatrutube
Рет қаралды 2,4 МЛН
Стыдные вопросы про Китай / вДудь
3:07:50
вДудь
Рет қаралды 6 МЛН
WPF+MVVM на примере игры 2048.
27:34
Юрий Силенок
Рет қаралды 1,8 М.
WPF. Binding
1:51:57
Sergey Videnin
Рет қаралды 4 М.
Chain Game Strong ⛓️
00:21
Anwar Jibawi
Рет қаралды 41 МЛН