огромная благодарность! такие уроки на вес золота, а Вы бесплатно со всеми поделились знаниями, дай Бог Вам здоровья! Чтобы Вы встретили таких же добрых людей, как и Вы сами!
Я начинающий (пилю программу для управления и вывода данных на ПК из самодельного устройства). Столько перечитал инфу в инете, столько пересмотрел роликов на ютубе, но только у вас наконец-тось понял что такое привязка, как создавать команды. Спасибо.
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
Полный курс по WPF с прекрасными сопровождающими комментариями, примерами, да еще и бесплатно! Год копаюсь в данной теме и это определенно лучший материал. Спасибо огромное за такой титанический труд!
Павел, огромнейшее спасибо и благодарность. Очень крутой материал! По данной тематике его вообще в принципе очень мало и практически невозможно собрать все в единое целое, а здесь все как на ладони, причем на открытой ладони, не зажато в кулачке)))))). Необыкновенная щедрость!)))
В этом плейлисте чуть ли не 50 часов лекций. Столько материала, что аж страшно) Хочется все изучить, но так как новичок, то дается сложновато пока. Буду ковырять помаленьку, спасибо за такой контент.
Живешь такой, потихоньку ковыряешь C#, заказы на фрилансе небольшие делаешь по фану. Думаешь, "вроде как, я программист". Ага. Посмотрел 4 часа на одном дыхании, и понял, что тебя обоссали ))) Если без шуток, огромная благодарность за контент! Столько моментов раскрыто, доселе неведомых.
Большое спасибо за целую серию очень полезных видео. Никак не мог понять патерн MVVM, но ваши видео очень помогли мне и я достаточно быстро освоился. Ещё бонусом к MVVM досталась настройка дизайна разных элементов WPF.
Огромное спасибо! Очень крутой материал, аж голова распухла )) Вдумчиво разбирал лекцию 2 дня, чтобы всё запомнить и потренироваться. Буду смотреть следующие. Просто информационный клад.
В кои-то веки ютуб нормальный ролик порекомендовал. Жаль только намного позже, чем это было нужно. Был вынужден начать с mvvm light, чтобы доделать программу, теперь вернулся к дефолтному wpf,и эти записи очень кстати, чтобы разобраться в кишках 😁
Внесу свои пять копеек. Огромное спасибо за такой материал. Понравилось, что вначале был разбор инфраструктуры проекта. Вообще, тема архитектуры это еще на целый стрим в 5 часов потянет). Еще раз благодарю.
Спасибо вам огромное. Много моментов, которые были непонятны при изучении построения приложений с помощью WPF в рамках MVVM, становятся ясны. Подача очень приятная.
Вот просто спасибо, что ты есть, Павел! Спасибо, что ты создал канал на ютубе! Спасибо, что ты записал видосы по MVVM! 3 дня убил на то чтобы разобраться с тем как привязать коллекцию к DataGrid и просто вот сделал привязку к заголовку как ты и по альтернативе к коллекции и все чудесным образом заработало СПАСИБО!
Павел, огромное спасибо за такой замечательный материал! На русском (да, и возможно, на английском) не найти такой подробный разбор паттерна MVVM в сети интернет, имхо. Также Вы довольно подробно разбираете другие аспекты разработки ПО, настолько комплексного подхода я еще не видел, и воды по минимуму, только самое необходимое с полезными отвлечениями! Продолжайте в том же духе и у Вас всегда будет благодарный слушатель-программист. По прошествии времени появился еще один момент, при котором программа сваливается в исключение. Появились регионы в названии которых тоже присутствует запятая, это - "Saint Helena, Ascension and Tristan da Cunha" и "Bonaire, Sint Eustatius and Saba", надо и их учитывать при парсинге csv-файла. Это для тех, кто столкнется с этой проблемой в настоящем и будущем.
@@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); } }
@@Shmachilin нет.Проблема была с графиком, т.к. последняя версия OxyPlot.WPF ,видимо , значительно отличается от той,что была на видео.Код с видео на ней у меня не работал. Поэтому я установил старую версию пакета м все заработало)
@@Shmachilin начал проходить ваши видео и как раз возникла ошибка "System.FormatException: "Unput string was not in a correct format" вот здесь "var counts = row.Skip(4).Select(int.Parse).ToArray();". Пока разобраться не удалось, в чем причина. Когда я полный 0, даже не удивляюсь..) Это тот момент, когда вы учите структурировать данные с гитхаба института
Все, почитал комментарии, увидел, что там добавились данные, все получилось! Мне бы такого препода, как вы! А то у меня вообще все тухло с этим. Приходится самообразованием заниматься. Через полгода сдавать тему по диплому, а я то одно то другое смотрю и пробую учиться. В итоге понимания в программировании никакого совершенно. Надеюсь, что после ваших уроков я все таки смогу, что нибудь сделать и не лопухнуться... Спасибо ВАМ огромное!
@@Shmachilin Единственное с начала 3 часа понял что урок для новичка сложноват ( Просто повторяю не понимая зачем это делается... И даже не понимаю имеет ли смысл смотреть дальше при таком раскладе... Ибо инфа из за непонимание объемной картины в целом просто не усваивается (((
@@Shmachilin посмотрев примеры попроще и со второго захода с осмыслением дошёл до 3 часа! Хочу сказать что контент бомба! На других видео либо умышленно, либо по незнанию упускаю много мелочей,. С тем же биндингом, Прям спасибо большое ещё раз за такую годноту !
На 56:44 вы начинаете писать notyfprop, потом говорите что пока вручную, потом будете это делать автоматически. Вот именно этот шаблон как создать? @@Shmachilin
при установки компонентов в начале урока был момент с установкой компонента "Git для Windows" - если я поставлю этот пункт - инсталятор не по.ерит уже установленную ранее git систему поставленную с официального сайта git? или это совсем другое?
Немного не могу понять как менять свойства к которым мы делаем Binding из какого-нибудь метода, вот допустим свойство Status 1:50:20 которое тут показано, если я внутри своего метода создаю объект класса MainWindowViewModel vm = new(); далее устанавливаю свойству Status нужный текст vm.Status = "moy_text"; То при вызове этого метода сам текст в статус баре не меняется. Как правильно логикой менять значение свойств во ViewModel, чтобы элемент их сразу же отобразил после изменения.
@@Shmachilin Создавал экземпляр MainWindowViewModel чтобы через него задать свойству Status какое-нибудь нужное мне значение (но так не сработало). Как мне сделать чтобы мой метод мог менять это свойство, а статус бар который прибинден к этому свойству после этого так-же мгновенно обновлялся.
Вы не должны сами создавать эту модель. Её создаёт контейнер сервисов. Вам надо получить её экземпляр либо вытащив её из DataContext главного окна, либо из контейнера сервисов. Но скорее всего Вы в корне делаете что-то не так...
@@Shmachilin Вот смотрите для примера, я создаю новый класс class Testclass, в нём создаю метод TestMethod(), что мне нужно написать внутри моего TestMethod, чтобы изменить текст в статус баре, на какой-нибудь другой. (С учетом того что как в 1:50:20 у нас уже прибинден статус бар к свойству Status описанному в MainWindowViewModel
Ваш класс должен быть либо сервисом приложения, зарегистрированным в контейнере сервисов. Тогда в его конструкторе Вы сможете добавить параметр TestClass(MainWindowViewModel model). Либо Вам надо получить доступ к главному контейнеру сервисов и из этого контейнера достать модель-представления главного окна.
Подскажите пожалуйсто как сделать команду для SelectedItem в ListView. А также если в также интиресует кнопка с коммандой внутри ItemTemplate listview что бы удалить выбраный по клику итем. В ListView нету Command для клика к сожелению(
Вы можете использовать для этого либо триггеры из библиотеки devblogs.microsoft.com/dotnet/open-sourcing-xaml-behaviors-for-wpf/, либо InputBinding thomaslevesque.com/2009/03/17/wpf-using-inputbindings-with-the-mvvm-pattern/
Спасибо за Ваш труд. Очень емко и информативно. Но решение в консольном проекте «yield return line.Replace("Korea,", "Korea -");» = костыль. Когда я изучал материал, в файле кроме Кореи появилась еще «Bonaire, Sint Eustatius and Saba» и все кранты. Вылетает с исключением. Полтора часа потратил, пока разобрался в чем дело и исправил 😊
А как исправили))? Дайте наводку))? Реплейс вначале через ковычки сделали почистили, а потом через запятую? Или сразу ковычки ловили через контейс и бегали от начальной до конечной, стирая/заменяя запятые?
Павел, а если панель контролов из wpf в winforms через user control и elementhost подрубить, то кнопки управления и слайдер из панели контролов также можно забиндить через viewmodelbase и inotifypropertychange? Делаю плеер на libvlc. Затормозил на этом моменте.
Огромное спасибо за видео!!! В используемом файле в колонке Province/State появилась запись "Bonaire, Sint Eustatius and Saba" пришлось добавить в строчку yield return line.Replace("Korea,", "Korea -").Replace("Bonaire,", "Bonaire -") Но получается теперь при добавлении в таблицу таких записей приложение будет падать Может кто нибудь знает как это исправить может с помощью регулярных выражений или еще как нибудь?
Модно. Но работать будет не шипко быстро. Для этого объявляет либо в этом же классе, либо в базовом словарь, ключом которого будет имя Свойства, а значением - значение свойства. И делаете два protected-метода: GET и Set, обращающиеся к этому словарю.
Не подскажете, что делать, если нужно менять наполнение окна (весь грид) по логическому течению программы (будет несколько шаблонов грида для разных ситуаций, которые следуют одна за другой)?
Добрый день! Можно поступить следующим образом: в приложении в окне может быть назначена главная модель-представления. Одним из её свойств может быть дочерняя модель-представления, которую главная модель может менять по своему усмотрению. В разметке окна можно добавить элемент ContentControl, свойство которого Content можно привязать к свойству "дочерняя модель-представления" у главной модели окна. Также в ресурсах, на пример, окна надо объявить набор DataTemplate'ов, где у каждого шаблона указать тип той модели-представления, которую он должен отображать. Таким образом, при смене значения свойства "дочерняя модель-представления" ContentControl будет искать шаблон, который будет отображать нужный тип данных - по сути, нужное отображение дочерней модели-представления. При этом всё это будет работать быстро и эффективно в согласии с шаблоном MVVM.
Здравствуйте! Павел, подскажите, пожалуйста, я установил пробную версию решарпера, но, как я понял, там из коробки нет таких шаблонов, как notyfprop, цвета шрифтов другие и тд. Попытался покапаться в настройках, но их там настолько много, что голову сломаешь + еще расширения свои собственные. Можно ли как-то Ваши настройки решарпера получить или видео небольшое запилить по его возможностям?
Всё, спасибо, нашел в 3 части от Павла ссылку на шаблоны Мало ли у кого такой же вопрос возникнет: "Да. Скачать шаблоны можно отсюда: github.com/Infarh/CV19/files/5629522/ReSharper.Templates.zip"
@@Shmachilin павел нет такого канала или группы ( во всяком случаи в поиске ее не выдает ) возможно закрыта в настройках приватности с приглашением по ссылки ((
как-то не получается добавить солюшн с несколькими проектами как это сделано на видио. у меня такое предупреждение: your solution contains files outside the solution folder which will not be included. затем если предупреждение проигнорить то папки гита создасца в проекте, а не в папке солюшн. что с этим можно сделать? и на 14:26 окошко по-другому выглядит. нет "отправить в github" хотя учетная запись гитхаба прикреплена. подскажите, что там надо в настройках поменять? vs studio 2019 16.10.0.
@@Shmachilin точно. в ней и была проблема. она сама по умолчанию была. а как сделать чтобы кнопка публикации на гитхаб была в тимэксплорере как на видио? у меня публикация только через раздел меню git работает. в принципе не так важно откуда публиковать, но может если подскажете, то лучше пойму настройки студии.
Павел а можете подсказать почему Binding не видит комментарии ? у вас на видео Они видны, или это все решарпер а стандартными средствами видимость ограничена в пределах кассового наследования ?
Уроки топовые. Есть пара вопросов: а что если UI у нас на wpf ,а вью модель на C++/cli. Причем проект сам на C++,а UI на wpf как dll ка подключается к проекту на C++/CLI. Будет ли в dll класс application,или может его можно как-то создать,через расширения разметки? Вью модель придется установить явно окну через. Data context? Спасибо!
У Вас есть интерфейс пользователя (UI) - визуальная часть. А также может быть что угодно в любой форме написанное хоть на C++, хоть на Delphi, хоть веб-сервис. Для приложения это всё можно выделить в понятие "модели". И для того чтобы "подружить" "модель" с UI можно взять "модель" и обернуть её в оболочку - модель-представления. Давно принял для себя стратегию поведения: если что-то не получается сделать "в лоб", то надо уходить в абстракцию добавляя новую оболочку которую я могу контролировать. Создать класс-модель поведение которого я могу определить так как мне надо и внутри этого класса уже выполнить управление над тем объектом, который надо контролировать. А снаружи я получу интерфейс моего класса в том виде, в котором он мне нужен. (Паттерн Фасад это вроде бы я "изобрёл" в своё время). Также и тут. Если у Вас есть какая-то вью-модель, но она Вас по каким-то причинам не устраивает, то создавайте над ней оболочку - ещё одну вью-модель и уже эту модель-представления передавать в UI.
@@Shmachilin да . Именно так я и делаю. А можно ли класс application в dll на wpf в таком случае(например в вызове управляемого кода на C# из неуправляемого на C++) определить (то есть именно в dll-ке)?
Нет ничего невозможного. Вопрос лишь в числе граблей на которые потребуется для этого наступить. Вот только зачем? Зачем тащить интерфейс внутрь логики?
@@Shmachilin тут такое дело... Есть проект на c++,с кучей легаси. К сожалению qt использовать нельзя. Поэтому в плане интерфейса выбора не так уж и много:либо mfc,но это та ещё боль. Либо wpf, но приходится как раз создавать абстракцию в коде c++/cli вью модель, которую и подсовывать ее. Вот такой вот колхоз...
Павел, подскажите пожалуйста, где можно основательно изучить технологию WPF с применением шаблона MVVM? В книгах очень все скудно, особенно с DataGrid.
Технически все понятно, но я ахаюсь только с одним пунктом, делаю все как по видео создаю WPF проект, создаю реп заливаю на гитхаб, но при добавлении /Tests/ WPF и консольного проектов, их не видит гит (и в дальнейшем работая на др компе при получении реп папка tests пустая), либо они отображаются в проекте основном.
Действительно очень позновательно, это огрномный труд. Хотелось узнать только момент по поводу привязки команд. Дело в том что я искал решени кросплатформеных приложений на C#, и так получилось что начал изучать avalonia framework, который мне понравился. Так же он практически не отличается от WPF поэтому решили на основе ваших вебинаров разработать тестовое приложение на avalonia. И на моменте создания команд я не до конца понял для чего так сильно мучаться с интерфейсами, если можно привязать к обычным методам. Или это работает только на avalonia? И очень хотел бы узнать ваше отношение к данному framework, не будет такой ли вероятности что вы запишити курс по нему?
Здравствуйте! Avalonia не смотрел... Времени не было. Но скорее всего идеи в нем те же. Что же касается интерфейсов, то это обеспечивает большую гибкость в использовании.
Подскажите пожалуйсто как забиндить TextBox к свойству типа double с UpdateSourceTrigger=PropertyChanged? При PropertyChanged не получаеться искользовать "точку". Я нашел где то решение на 3-4 класса ... Может быть есть что то по проще и короче?
Есть такой костылик: добавить небольшую задержку на ввод следующей за точкой цифры. Text="{Binding TestValue, UpdateSourceTrigger=PropertyChanged, Delay=100}" Если пользователь не успеет за 100мс ввести цифру, следующую за точкой, то значение из свойства TestValue перечитано и точка будет отброшена. Задержку можно подобрать так как будет удобно.
У меня 2 вопроса. В приложении главное окно, в котором реализованно переключение между 5 пейджами. в каждом page по 2 listView и 1 datagrid , 3 диалога для добавления данных , 1 для вывода сообщений, плюс поля для отображения доп информации при выборе какой либо строки, диалог на удаление, сюда же biningи visibl и enable и на selectValue. Так вот это тонна биндингов и переменных. такая тонна, что уже кажется , что что-то пошло не так и это бред. Это норм для mvvm с сложным ui? Если это можно назвать сложным. Или я что то не так делаю? И второй вопрос- у вас в программе для самолётов было много окон , которые зависили от графика и информация в них отображалсь исходя из графика. Как и наоборот когда вы нажимали на плей на окне с приборами все начинало двигаться, включая график. Как это реализованно? Это дочерние окна?
Добрый день! Вы можете разбивать представление на вложенные элементы - выделять повторяющиеся части в отдельные компоненты. И да, привязок там может быть очень много. А в том приложении есть объект плеер, который "двигает" время, есть объект "сервер индикации", который ловит изменения времени в плеере (обрабатывает событие), читает данные из контейнера значений и отсылает данные клиентам. Клиенты имеют набор свойств к которым привязываются визуальные индикаторы.
@@Shmachilin когда открывается новое окно с клиентом . Вы туда передаете DataContext ? Или как новые окна получают увеломления о событиях или новые данные?
Когда открывается новое окно, то для него создаётся его собственная модель-представления. Модель-представления дочернего окна может подписаться на события модели-представления родительского окна. Либо модель-представления родительского окна может сохранить себе ссылку на модель-представления дочернего окна и передавать ей данные.
Подскажите, каким образом можно отобразить данные в реальном времени не перезапуская программу? т.е. есть БД откуда берутся данные и отображаются в программе в момент запуска программы. Как только в БД попадают новые данные из вне, приложение их не отображает. Только при перезапуске программы... Подскажите, как можно сделать чтоб при изменение значений в БД, сразу это отображалось в программе?
@@Shmachilin Спасибо, вроде на данном этапе разобралась. А так подключалась через EntityFramework, проблема была что получала от EntityFramework те же данные, а не обновленные и сделала кнопку обновить, как вы рекомендовали. Теперь думаю как реализовать все это дело через таймер, потому как не хочу получать данные при клике на кнопку обновить. Спасибо за очень ценный материал.
Здравствуйте, автор! Спасибо за Ваши старания. Подскажите пожалуйста, на сколько это всё актуально на сегодня, ведь sdk уже и 5.0 и 6.0 уже существуют... Надо ли мне обязательно и 3 версию ставить?
@@Shmachilin спасибо за оперативный ответ! Перехожу из вэба на C# и десктопные приложения, хочу заниматься разработкой VST и другой работой со звуком. Нашёл Ваш канал, он как никогда кстати. Хороший вход... Уж не Гоша Дударь, прости г-ди.
@@Shmachilin я только сейчас присоединяюсь к прохождению ваших нереально крутых образовательных видео! а если уже .net 8.0 есть? его можно использовать? и спасибо за уроки! гоша дударь курит в сторонке...
Добрый день! Я просмотрел половину видео и местами бывает не совсем понятно. Хотелось бы узнать для людей с каким уровнем знаний рассчитан данный урок? И достаточно ли будет этих знаний, чтобы трудостроиться в IT компанию ?
Здравствуйте! Ну как минимум требуется уметь отличать абстрактный класс от интерфейса и знать базовое представление о паттернах проектирования (что они хотя бы есть...) Достаточно ли этого будет для трудоустройства сказать сложно.
Делаю все тоже самое но на моменте записи MainWindowViewModel: ViewModel выходит ошибка ''ViewModel" является пространство имен, но используется как тип." Не могу понять почему P.S Бред. Создал новый проект, все работает, а в старом почему-то нет... Ох уж этот visualstudio.
По всей видимости у Вас пака, в которой лежат модели-представления, называется "ViewModel", а не "ViewModels". В результате было создано пространство имён "ViewModel" (в единственном числе), совпадающее с именем класса.
@@Shmachilin Если команда объявлена как отдельный класс, то экземпляр команды создается для каждого упоминания ее в разметке, чтобы этого не произошло мы используем ее как ресурс, т.к. в этом случае экземпляр команды создастся единожды. Когда команда часть ViewModel, то созданием команды рулим мы сами, создаем ее в конструкторе 1 раз. Правильно я понял?
Пытался сделать свою команду "Свернуть окно приложения"(MinimizedApplicationCommand) для практики, не вышло( на прямую в xaml окна всё получается this.WindowState = WindowState.Minimized; а через команду не могу сообразить как хD
Для имён перечислений, структур, делегатов, классов, членов классов (полей, свойств, методов), а также входных переменных метода принят PascalCase. Для локальных переменных - lower_case. camelCase - это стиль Java.
@@Shmachilin эм нет, во всех coding conventions (в том числе и от самих microsoft) lower_case никогда не использовался в C#. В C# используют только PascalCase и camelCase, lower_case нет
😀I'm enjoying watching TH-cam. 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?
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 -"); } }
огромная благодарность! такие уроки на вес золота, а Вы бесплатно со всеми поделились знаниями, дай Бог Вам здоровья! Чтобы Вы встретили таких же добрых людей, как и Вы сами!
Какая редкость, контент на подобную тему, ну очень мало. Павел, спасибо!
Сам собирал по крупицам...
Согласен, давно искал что то подобное.
Я начинающий (пилю программу для управления и вывода данных на ПК из самодельного устройства). Столько перечитал инфу в инете, столько пересмотрел роликов на ютубе, но только у вас наконец-тось понял что такое привязка, как создавать команды. Спасибо.
Это реально шедевр!!! Самое лучшее что можно посмотреть по WPF+MVVM в ру сегменте!!
+++
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
Полный курс по WPF с прекрасными сопровождающими комментариями, примерами, да еще и бесплатно! Год копаюсь в данной теме и это определенно лучший материал. Спасибо огромное за такой титанический труд!
Буду рад если Вам это пригодится и Вы, в свою очередь, научите этому кого-то.
@@Shmachilin aanssmAssad'ssaananrashassdnaads NVqamaskssans
Asasnannnnnnnannnmnnnnn
7ga
7ga
Павел, огромнейшее спасибо и благодарность. Очень крутой материал! По данной тематике его вообще в принципе очень мало и практически невозможно собрать все в единое целое, а здесь все как на ладони, причем на открытой ладони, не зажато в кулачке)))))). Необыкновенная щедрость!)))
Пишите вопросы.
В этом плейлисте чуть ли не 50 часов лекций. Столько материала, что аж страшно) Хочется все изучить, но так как новичок, то дается сложновато пока. Буду ковырять помаленьку, спасибо за такой контент.
Живешь такой, потихоньку ковыряешь C#, заказы на фрилансе небольшие делаешь по фану. Думаешь, "вроде как, я программист". Ага. Посмотрел 4 часа на одном дыхании, и понял, что тебя обоссали ))) Если без шуток, огромная благодарность за контент! Столько моментов раскрыто, доселе неведомых.
А сколько у меня таких моментов было с подобным ощущением... и сколько ещё будет...
Это я когда на работу в ит пришел
Спасибо! Наверно лучший материал по данной тематике, по крайней мере в Ru-нете!
Большое спасибо за целую серию очень полезных видео. Никак не мог понять патерн MVVM, но ваши видео очень помогли мне и я достаточно быстро освоился. Ещё бонусом к MVVM досталась настройка дизайна разных элементов WPF.
Огромное спасибо! Очень крутой материал, аж голова распухла )) Вдумчиво разбирал лекцию 2 дня, чтобы всё запомнить и потренироваться. Буду смотреть следующие. Просто информационный клад.
У кого-то же хватает терпения всё это просмотреть...
@@Shmachilin Получаю огромное удовольствие, от души благодарю!
Это лучшие видео по теме из всего , что я видел!!!
Особое спасибо за науку по правильной организации структуры проекта.
Просмотр ОТ и ДО, т.е. ВСЕ %) Лайк за работу!
В кои-то веки ютуб нормальный ролик порекомендовал. Жаль только намного позже, чем это было нужно. Был вынужден начать с mvvm light, чтобы доделать программу, теперь вернулся к дефолтному wpf,и эти записи очень кстати, чтобы разобраться в кишках 😁
Спасибо большое! Достаточно подробно, но о многом, с пояснениями и доходчиво! Большая благодарность!
Внесу свои пять копеек. Огромное спасибо за такой материал. Понравилось, что вначале был разбор инфраструктуры проекта. Вообще, тема архитектуры это еще на целый стрим в 5 часов потянет). Еще раз благодарю.
Очень рад что нашел настолько подробное видео по данной теме. Спасибо!)
Большое спасибо! Лучший мастер класс и не только по MVVM! Ваш труд мне очень помог, желаю успехов.
Спасибо вам огромное. Много моментов, которые были непонятны при изучении построения приложений с помощью WPF в рамках MVVM, становятся ясны. Подача очень приятная.
Вот просто спасибо, что ты есть, Павел! Спасибо, что ты создал канал на ютубе! Спасибо, что ты записал видосы по MVVM! 3 дня убил на то чтобы разобраться с тем как привязать коллекцию к DataGrid и просто вот сделал привязку к заголовку как ты и по альтернативе к коллекции и все чудесным образом заработало СПАСИБО!
Павел благодарю! Отлично всё объясняете.
Очень полезное видео.
С такими знаниями, вам вполне можно создавать свои платные курсы по обучению людей. Код на высшем уровне)
Спасибо Дмитрий за Ваш урок!
Павел, огромное спасибо за такой замечательный материал! На русском (да, и возможно, на английском) не найти такой подробный разбор паттерна MVVM в сети интернет, имхо. Также Вы довольно подробно разбираете другие аспекты разработки ПО, настолько комплексного подхода я еще не видел, и воды по минимуму, только самое необходимое с полезными отвлечениями! Продолжайте в том же духе и у Вас всегда будет благодарный слушатель-программист.
По прошествии времени появился еще один момент, при котором программа сваливается в исключение. Появились регионы в названии которых тоже присутствует запятая, это - "Saint Helena, Ascension and Tristan da Cunha" и "Bonaire, Sint Eustatius and Saba", надо и их учитывать при парсинге csv-файла. Это для тех, кто столкнется с этой проблемой в настоящем и будущем.
По ходу надо отдельным стримом делать нормальный парсер csv.
@@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);
}
}
Просто клад нашла!! Здорово. Спасибо. Разбираюсь в лекции) После разбора иду дальше смотреть
Отличная подача материала. Спасибо!
Очень крутой вебинар!
Собираюсь посмотреть все видео по wpf mvvm
вау, я наткнулся на потрясный контент, спасибо!
Какой вы молодец проводить уроки по средствам трансляции в Ютубе.
Спасибо за контент)Посмотрел пока что первую часть(и повторил конечно же её)
Очень доступно рассказываете)
С csv проблем не возникло?
@@Shmachilin нет.Проблема была с графиком, т.к. последняя версия OxyPlot.WPF ,видимо , значительно отличается от той,что была на видео.Код с видео на ней у меня не работал.
Поэтому я установил старую версию пакета м все заработало)
@@Shmachilin начал проходить ваши видео и как раз возникла ошибка "System.FormatException: "Unput string was not in a correct format" вот здесь "var counts = row.Skip(4).Select(int.Parse).ToArray();". Пока разобраться не удалось, в чем причина. Когда я полный 0, даже не удивляюсь..) Это тот момент, когда вы учите структурировать данные с гитхаба института
Все, почитал комментарии, увидел, что там добавились данные, все получилось! Мне бы такого препода, как вы! А то у меня вообще все тухло с этим. Приходится самообразованием заниматься. Через полгода сдавать тему по диплому, а я то одно то другое смотрю и пробую учиться. В итоге понимания в программировании никакого совершенно. Надеюсь, что после ваших уроков я все таки смогу, что нибудь сделать и не лопухнуться... Спасибо ВАМ огромное!
Спасибо вам за объяснение. Все кристально понятно!
Спасибо шикарное видео!!!!
Очень полезное!
Спасибо за видео очень много интересного
Шедеврально!!!!
Бро круто! лайк и подписка однозначно! не останавливайся
Благодарю!
@@Shmachilin Единственное с начала 3 часа понял что урок для новичка сложноват (
Просто повторяю не понимая зачем это делается...
И даже не понимаю имеет ли смысл смотреть дальше при таком раскладе...
Ибо инфа из за непонимание объемной картины в целом просто не усваивается (((
Есть такое. Скорее это для тех, кто уже не пугается конструкций языка, успел поработать с WinForms и слышал что такое паттерны проектирования.
@@Shmachilin посмотрев примеры попроще и со второго захода с осмыслением дошёл до 3 часа! Хочу сказать что контент бомба! На других видео либо умышленно, либо по незнанию упускаю много мелочей,. С тем же биндингом, Прям спасибо большое ещё раз за такую годноту !
@@АлексДжаванов задавайте вопросы! А то скучно...
Очень помогло понять mvvm, спасибо
Спасибо большое!
СУПЕР!!!!
Круто, спасибо за труд. Продолжай!
Очень круто! Спасибо!
Спасибо за ролик , только не прекращайте выпускать ролики 🙏
Вы очень круты!!! Спасибо большое!
Вы просто бог))
Спасибо! очень годный контент
все четко ))) узнал кое что новое
Действительно, хорошее изложение. Я ток начал учить мввм, это видео прям прояснило многие моменты. Но я понял что ничего не смыслю в программировании(
Когда-то я думал, что никогда и ни за что не буду программировать...
@@Shmachilin что изменилось?
Было время свободное и была книга (Delphi5 2000 год). Сел, вдумчиво прочитал... Потом был ВУЗ и вторая вышка по программированию.
@@Shmachilin а сколько вам лет, когда вы начали программировать? я правильно понял, что первая вышка была не по программированию?
@@vyachgusev Первая Вышка была по радиотехнике.
Класс спасибо
Очень круто!
Cпасибо!
Здравствуйте, подскажите как самому создать шаблон для генерации кода? 56:44
Какого кода?
На 56:44 вы начинаете писать notyfprop, потом говорите что пока вручную, потом будете это делать автоматически. Вот именно этот шаблон как создать? @@Shmachilin
С помощью каких инструментов вы рисовали графики в приложении для института 33:25?
OxyPlot
www.nuget.org/packages?q=OxyPlot.Contrib.Wpf
Спасибо
3:25:00 думаю здесь можно было использовать IAsyncEnumerable, тогда весь код был бы асинхронным.
Или IAsyncEnumetable?
@@Shmachilin Вот видишь, тяжело написать)
при установки компонентов в начале урока был момент с установкой компонента "Git для Windows" - если я поставлю этот пункт - инсталятор не по.ерит уже установленную ранее git систему поставленную с официального сайта git? или это совсем другое?
Вопрос хороший. Не пробовал. Обычно проблем с переустановкой Git в системе не возникало.
Немного не могу понять как менять свойства к которым мы делаем Binding из какого-нибудь метода, вот допустим свойство Status 1:50:20 которое тут показано, если я внутри своего метода создаю объект класса MainWindowViewModel vm = new(); далее устанавливаю свойству Status нужный текст vm.Status = "moy_text"; То при вызове этого метода сам текст в статус баре не меняется. Как правильно логикой менять значение свойств во ViewModel, чтобы элемент их сразу же отобразил после изменения.
А где и зачем Вы создаёте MainWindowViewModel?
@@Shmachilin Создавал экземпляр MainWindowViewModel чтобы через него задать свойству Status какое-нибудь нужное мне значение (но так не сработало). Как мне сделать чтобы мой метод мог менять это свойство, а статус бар который прибинден к этому свойству после этого так-же мгновенно обновлялся.
Вы не должны сами создавать эту модель. Её создаёт контейнер сервисов. Вам надо получить её экземпляр либо вытащив её из DataContext главного окна, либо из контейнера сервисов. Но скорее всего Вы в корне делаете что-то не так...
@@Shmachilin Вот смотрите для примера, я создаю новый класс class Testclass, в нём создаю метод TestMethod(), что мне нужно написать внутри моего TestMethod, чтобы изменить текст в статус баре, на какой-нибудь другой. (С учетом того что как в 1:50:20 у нас уже прибинден статус бар к свойству Status описанному в MainWindowViewModel
Ваш класс должен быть либо сервисом приложения, зарегистрированным в контейнере сервисов. Тогда в его конструкторе Вы сможете добавить параметр TestClass(MainWindowViewModel model). Либо Вам надо получить доступ к главному контейнеру сервисов и из этого контейнера достать модель-представления главного окна.
Огромнейшее спасибо за плейлист по WPF! Есть ли у вас аккаунт на бусти? Возможно кто-то захочет вас отблагодарить монеткой, если у них есть лишняя)
Gracias Mister....saludos de los andes peruanos.... la próxima activa el subtitulo....
Подскажите пожалуйсто как сделать команду для SelectedItem в ListView. А также если в также интиресует кнопка с коммандой внутри ItemTemplate listview что бы удалить выбраный по клику итем. В ListView нету Command для клика к сожелению(
Вы можете использовать для этого либо триггеры из библиотеки devblogs.microsoft.com/dotnet/open-sourcing-xaml-behaviors-for-wpf/, либо InputBinding thomaslevesque.com/2009/03/17/wpf-using-inputbindings-with-the-mvvm-pattern/
Спасибо за видео, лучшее что есть про mvvm на русском языке!
Спасибо за Ваш труд. Очень емко и информативно.
Но решение в консольном проекте «yield return line.Replace("Korea,", "Korea -");» = костыль.
Когда я изучал материал, в файле кроме Кореи появилась еще «Bonaire, Sint Eustatius and Saba» и все кранты. Вылетает с исключением. Полтора часа потратил, пока разобрался в чем дело и исправил 😊
Это не костыли. Это специально разложенные грабли!
Спасибо что написал в комментах, а то тоже после исключения полез сразу сюда посмотреть ))
А как исправили))? Дайте наводку))? Реплейс вначале через ковычки сделали почистили, а потом через запятую?
Или сразу ковычки ловили через контейс и бегали от начальной до конечной, стирая/заменяя запятые?
@@oldschool2445 удалось исправить))?
рядом вот такие грабли положил)
var i = 0;
if (!int.TryParse(cell[4], out int res))
i = 1;
var Counts = cell.Skip(4 + i).Select(int.Parse).ToArray();
Стоит ли смотреть и пытаться понять эти уроки если опит работы с С# 3 месяца?
Павел, а если панель контролов из wpf в winforms через user control и elementhost подрубить, то кнопки управления и слайдер из панели контролов также можно забиндить через viewmodelbase и inotifypropertychange?
Делаю плеер на libvlc. Затормозил на этом моменте.
Скорее всего да. У ElementHost есть свойство DataContext.
@@Shmachilin Благодарю! надо попробовать. Тяжко c# дается если честно и просто времени не хватает на обучение.
@@ПетровичиК-м5у Нужно больше практики и конкретных, полезных кому-то задач. И стараться уйти поскорее от WinForms.
Огромное спасибо за видео!!!
В используемом файле в колонке Province/State появилась запись "Bonaire, Sint Eustatius and Saba"
пришлось добавить в строчку
yield return line.Replace("Korea,", "Korea -").Replace("Bonaire,", "Bonaire -")
Но получается теперь при добавлении в таблицу таких записей приложение будет падать
Может кто нибудь знает как это исправить может с помощью регулярных выражений или еще как нибудь?
Переписать модуль разбора csv так, чтобы можно было в значениях использовать кавычки без костылей.
@@Shmachilin спасибо)) но вот ток кто бы знал как это сделать 😁😂
Регулярные выражения, готовые библиотеки для работы с CSV...
@@Shmachilin Павел хочу сам написать, но либо туповат либо мало опыта, 3 вечере голову ломаю, так и до конца не удалось сделать чтоб за работало)))
@@Shmachilin в итоге написал спустя дня 4 раздумий как это сделать😁 а щас смотрю и думаю вот я тугой, там же все очевиднее некуда))
Наконец-то наткнулся на клад!
Можно ли во вьюмодели сделать проперти без явного объявления приватного поля?
Модно. Но работать будет не шипко быстро. Для этого объявляет либо в этом же классе, либо в базовом словарь, ключом которого будет имя Свойства, а значением - значение свойства. И делаете два protected-метода: GET и Set, обращающиеся к этому словарю.
Не подскажете, что делать, если нужно менять наполнение окна (весь грид) по логическому течению программы (будет несколько шаблонов грида для разных ситуаций, которые следуют одна за другой)?
Добрый день! Можно поступить следующим образом: в приложении в окне может быть назначена главная модель-представления. Одним из её свойств может быть дочерняя модель-представления, которую главная модель может менять по своему усмотрению. В разметке окна можно добавить элемент ContentControl, свойство которого Content можно привязать к свойству "дочерняя модель-представления" у главной модели окна. Также в ресурсах, на пример, окна надо объявить набор DataTemplate'ов, где у каждого шаблона указать тип той модели-представления, которую он должен отображать. Таким образом, при смене значения свойства "дочерняя модель-представления" ContentControl будет искать шаблон, который будет отображать нужный тип данных - по сути, нужное отображение дочерней модели-представления. При этом всё это будет работать быстро и эффективно в согласии с шаблоном MVVM.
@@Shmachilin Спасибо Вам огромное, все получилось. Отдельная благодарность за уникальный и качественный контент.
Здравствуйте! Павел, подскажите, пожалуйста, я установил пробную версию решарпера, но, как я понял, там из коробки нет таких шаблонов, как notyfprop, цвета шрифтов другие и тд. Попытался покапаться в настройках, но их там настолько много, что голову сломаешь + еще расширения свои собственные. Можно ли как-то Ваши настройки решарпера получить или видео небольшое запилить по его возможностям?
Всё, спасибо, нашел в 3 части от Павла ссылку на шаблоны
Мало ли у кого такой же вопрос возникнет:
"Да. Скачать шаблоны можно отсюда: github.com/Infarh/CV19/files/5629522/ReSharper.Templates.zip"
Спасибо огромное за ваши труды. Лучший материал на русском языке!
Павел а в самом конце в упоминаете о чтате в телеге
что за чат )? в него можно попасть )?
@GB_CSharp
@@Shmachilin павел нет такого канала или группы ( во всяком случаи в поиске ее не выдает ) возможно закрыта в настройках приватности с приглашением по ссылки ((
как-то не получается добавить солюшн с несколькими проектами как это сделано на видио. у меня такое предупреждение:
your solution contains files outside the solution folder which will not be included. затем если предупреждение проигнорить то папки гита создасца в проекте, а не в папке солюшн. что с этим можно сделать?
и на 14:26 окошко по-другому выглядит. нет "отправить в github" хотя учетная запись гитхаба прикреплена. подскажите, что там надо в настройках поменять? vs studio 2019 16.10.0.
Галку не ставили при создании решения что бы размещать проект в папке решения?
@@Shmachilin точно. в ней и была проблема. она сама по умолчанию была. а как сделать чтобы кнопка публикации на гитхаб была в тимэксплорере как на видио? у меня публикация только через раздел меню git работает. в принципе не так важно откуда публиковать, но может если подскажете, то лучше пойму настройки студии.
Павел а можете подсказать почему Binding не видит комментарии ?
у вас на видео Они видны, или это все решарпер а стандартными средствами видимость ограничена в пределах кассового наследования ?
Да стандартный редактор VS убогий и много чего не показывает. Ставьте решарпер.
@@aRRma99 дак решарпер денежки просит 😎
@@АлексДжаванов на торрент загляните
@@aRRma99 серьезно ))?
Тяжёлые наркотики покупать только у дилера!
Cool
Уроки топовые. Есть пара вопросов: а что если UI у нас на wpf ,а вью модель на C++/cli. Причем проект сам на C++,а UI на wpf как dll ка подключается к проекту на C++/CLI. Будет ли в dll класс application,или может его можно как-то создать,через расширения разметки? Вью модель придется установить явно окну через. Data context? Спасибо!
У Вас есть интерфейс пользователя (UI) - визуальная часть. А также может быть что угодно в любой форме написанное хоть на C++, хоть на Delphi, хоть веб-сервис. Для приложения это всё можно выделить в понятие "модели". И для того чтобы "подружить" "модель" с UI можно взять "модель" и обернуть её в оболочку - модель-представления. Давно принял для себя стратегию поведения: если что-то не получается сделать "в лоб", то надо уходить в абстракцию добавляя новую оболочку которую я могу контролировать. Создать класс-модель поведение которого я могу определить так как мне надо и внутри этого класса уже выполнить управление над тем объектом, который надо контролировать. А снаружи я получу интерфейс моего класса в том виде, в котором он мне нужен. (Паттерн Фасад это вроде бы я "изобрёл" в своё время). Также и тут. Если у Вас есть какая-то вью-модель, но она Вас по каким-то причинам не устраивает, то создавайте над ней оболочку - ещё одну вью-модель и уже эту модель-представления передавать в UI.
@@Shmachilin да . Именно так я и делаю. А можно ли класс application в dll на wpf в таком случае(например в вызове управляемого кода на C# из неуправляемого на C++) определить (то есть именно в dll-ке)?
Нет ничего невозможного. Вопрос лишь в числе граблей на которые потребуется для этого наступить. Вот только зачем? Зачем тащить интерфейс внутрь логики?
@@Shmachilin тут такое дело... Есть проект на c++,с кучей легаси. К сожалению qt использовать нельзя. Поэтому в плане интерфейса выбора не так уж и много:либо mfc,но это та ещё боль. Либо wpf, но приходится как раз создавать абстракцию в коде c++/cli вью модель, которую и подсовывать ее. Вот такой вот колхоз...
А главным запускаемым проектом должен быть обязательно проект на c++?
Павел, подскажите пожалуйста, где можно основательно изучить технологию WPF с применением шаблона MVVM? В книгах очень все скудно, особенно с DataGrid.
В своё время я по Метанит и professorweb.ru изучал. Но с книгами по этому делу (на русском) беда - да...
Технически все понятно, но я ахаюсь только с одним пунктом, делаю все как по видео создаю WPF проект, создаю реп заливаю на гитхаб, но при добавлении /Tests/ WPF и консольного проектов, их не видит гит (и в дальнейшем работая на др компе при получении реп папка tests пустая), либо они отображаются в проекте основном.
Галочку поставили в диалоге создания первого проекта о размещении всех файлов в одном каталоге? Ссылку на ГитХаб репозиторий дайте посмотреть.
@@Shmachilin не ставил 😬🫤завтра свежим взглядом погляжу, спасибо 🫡
@@TbIPDblM ссылку скиньте.
@@Shmachilin разобрался, при создании у меня первого проекта файл решения там же располагался, галочку снял, и все стало ок
Теперь и Вы знаете о этих граблях. Я бы руки оторвал тому кто эту галочку там разместил.
Ставь лайк, если ты на 3:40:00 тоже кричал автору в монитор, что он уже распарсил строку, у него уже массив, кавычки можно удалять.
Действительно очень позновательно, это огрномный труд.
Хотелось узнать только момент по поводу привязки команд. Дело в том что я искал решени кросплатформеных приложений на C#, и так получилось что начал изучать avalonia framework, который мне понравился. Так же он практически не отличается от WPF поэтому решили на основе ваших вебинаров разработать тестовое приложение на avalonia.
И на моменте создания команд я не до конца понял для чего так сильно мучаться с интерфейсами, если можно привязать к обычным методам. Или это работает только на avalonia?
И очень хотел бы узнать ваше отношение к данному framework, не будет такой ли вероятности что вы запишити курс по нему?
Здравствуйте! Avalonia не смотрел... Времени не было. Но скорее всего идеи в нем те же. Что же касается интерфейсов, то это обеспечивает большую гибкость в использовании.
Здравствуйте, вы можете добавить субтитры к своей серии MVVM?
Здравствуйте! Пока наверное нет... не готов.
момент с textbox ,почему то он не в какую не менялся ,ненаписать не удалить что в нем
Где именно?
@@Shmachilin это уже вроде особо не нужно ,но сейчас пытаюсь кнопками влево вправо переключать ,не получается.Хотя вроде бы все прописал
а какие у вас дополнения для студии ? в частности внизу что то похожее на счетчик ресурсов
Справа снизу информацию выводят РеШарпер и PerfWatson Mon
marketplace.visualstudio.com/items?itemName=PaulHarrington.PerfWatsonMonitor-9621
@@Shmachilin спасибо!
Подскажите пожалуйсто как забиндить TextBox к свойству типа double с UpdateSourceTrigger=PropertyChanged? При PropertyChanged не получаеться искользовать "точку". Я нашел где то решение на 3-4 класса ... Может быть есть что то по проще и короче?
Есть такой костылик: добавить небольшую задержку на ввод следующей за точкой цифры.
Text="{Binding TestValue, UpdateSourceTrigger=PropertyChanged, Delay=100}"
Если пользователь не успеет за 100мс ввести цифру, следующую за точкой, то значение из свойства TestValue перечитано и точка будет отброшена. Задержку можно подобрать так как будет удобно.
У меня 2 вопроса. В приложении главное окно, в котором реализованно переключение между 5 пейджами. в каждом page по 2 listView и 1 datagrid , 3 диалога для добавления данных , 1 для вывода сообщений, плюс поля для отображения доп информации при выборе какой либо строки, диалог на удаление, сюда же biningи visibl и enable и на selectValue. Так вот это тонна биндингов и переменных. такая тонна, что уже кажется , что что-то пошло не так и это бред. Это норм для mvvm с сложным ui? Если это можно назвать сложным. Или я что то не так делаю? И второй вопрос- у вас в программе для самолётов было много окон , которые зависили от графика и информация в них отображалсь исходя из графика. Как и наоборот когда вы нажимали на плей на окне с приборами все начинало двигаться, включая график. Как это реализованно? Это дочерние окна?
Добрый день! Вы можете разбивать представление на вложенные элементы - выделять повторяющиеся части в отдельные компоненты. И да, привязок там может быть очень много.
А в том приложении есть объект плеер, который "двигает" время, есть объект "сервер индикации", который ловит изменения времени в плеере (обрабатывает событие), читает данные из контейнера значений и отсылает данные клиентам. Клиенты имеют набор свойств к которым привязываются визуальные индикаторы.
@@Shmachilin когда открывается новое окно с клиентом . Вы туда передаете DataContext ? Или как новые окна получают увеломления о событиях или новые данные?
Когда открывается новое окно, то для него создаётся его собственная модель-представления. Модель-представления дочернего окна может подписаться на события модели-представления родительского окна. Либо модель-представления родительского окна может сохранить себе ссылку на модель-представления дочернего окна и передавать ей данные.
@@Shmachilin понятно, спасибо
Отпишитесь по результатам.
Подскажите, каким образом можно отобразить данные в реальном времени не перезапуская программу?
т.е. есть БД откуда берутся данные и отображаются в программе в момент запуска программы.
Как только в БД попадают новые данные из вне, приложение их не отображает. Только при перезапуске программы... Подскажите, как можно сделать чтоб при изменение значений в БД, сразу это отображалось в программе?
А к БД Вы как подключаетесь? Что мешает сделать кнопку/таймер и выполнить эту процедуру вновь в процессе работы программы и загрузить данные снова?
@@Shmachilin Спасибо, вроде на данном этапе разобралась.
А так подключалась через EntityFramework, проблема была что получала от EntityFramework те же данные, а не обновленные и сделала кнопку обновить, как вы рекомендовали.
Теперь думаю как реализовать все это дело через таймер, потому как не хочу получать данные при клике на кнопку обновить.
Спасибо за очень ценный материал.
Здравствуйте, автор! Спасибо за Ваши старания.
Подскажите пожалуйста, на сколько это всё актуально на сегодня, ведь sdk уже и 5.0 и 6.0 уже существуют...
Надо ли мне обязательно и 3 версию ставить?
Здравствуйте! Всё актуально. Используйте последнюю версию Visual Studio и SDK .Net
@@Shmachilin спасибо за оперативный ответ! Перехожу из вэба на C# и десктопные приложения, хочу заниматься разработкой VST и другой работой со звуком. Нашёл Ваш канал, он как никогда кстати. Хороший вход... Уж не Гоша Дударь, прости г-ди.
@@Shmachilin я только сейчас присоединяюсь к прохождению ваших нереально крутых образовательных видео! а если уже .net 8.0 есть? его можно использовать? и спасибо за уроки! гоша дударь курит в сторонке...
@@vyachgusev там концептуально ничего не поменялось. Синтаксис интереснее стал.
Добрый день! Я просмотрел половину видео и местами бывает не совсем понятно. Хотелось бы узнать для людей с каким уровнем знаний рассчитан данный урок? И достаточно ли будет этих знаний, чтобы трудостроиться в IT компанию ?
Здравствуйте! Ну как минимум требуется уметь отличать абстрактный класс от интерфейса и знать базовое представление о паттернах проектирования (что они хотя бы есть...)
Достаточно ли этого будет для трудоустройства сказать сложно.
Делаю все тоже самое но на моменте записи MainWindowViewModel: ViewModel выходит ошибка ''ViewModel" является пространство имен, но используется как тип." Не могу понять почему
P.S Бред. Создал новый проект, все работает, а в старом почему-то нет... Ох уж этот visualstudio.
По всей видимости у Вас пака, в которой лежат модели-представления, называется "ViewModel", а не "ViewModels". В результате было создано пространство имён "ViewModel" (в единственном числе), совпадающее с именем класса.
Как сделать отдельную команду "ChangeTabIndexCommand" , что бы можно было через "Window.Recources" ?
У команды есть параметр. Можно передать TabControl в качестве параметра.
Когда команда CloseApplicationCommand определена как класс в отдельном файле, то как ресурс она объявляется
Как объявить ее ресурсом если она определена в ViewModel?
Спасибо.
Если она часть модели-представления, то зачем её надо "закреплять" в ресурсах? Есть ведь модель-локатор...
@@Shmachilin Если команда объявлена как отдельный класс, то экземпляр команды создается для каждого упоминания ее в разметке, чтобы этого не произошло мы используем ее как ресурс, т.к. в этом случае экземпляр команды создастся единожды. Когда команда часть ViewModel, то созданием команды рулим мы сами, создаем ее в конструкторе 1 раз. Правильно я понял?
Через разметку никак. В коде - можно в ресурсы добавить что угодно. Один вопрос: а зачем?
@@Shmachilin Сейчас вопрос зачем уже не стоит. Сразу после просмотра это было не совсем понятно ;)
Подскажите, пожалуйста, есть ли исходники RRG-Express?
Исходники есть.
@@Shmachilin можете дать ссылку, пожалуйста? Очень заинтересовали некоторые функции, хочется посмотреть на реализацию)
Ссылку дать не могу. Коммерческий продукт ГСС. Могу ответить на вопросы.
Пытался сделать свою команду "Свернуть окно приложения"(MinimizedApplicationCommand) для практики, не вышло( на прямую в xaml окна всё получается this.WindowState = WindowState.Minimized; а через команду не могу сообразить как хD
Надо смотреть как Вы пытались её сделать... Надо либо ссылку на ГитХаб, либо хотя бы фрагмент кода. Иначе там много что может пойти не так.
а почему поля классов с большой буквы? Просто такой стиль написания кода? Просто вроде общепринято с маленькой обозначать
Для имён перечислений, структур, делегатов, классов, членов классов (полей, свойств, методов), а также входных переменных метода принят PascalCase. Для локальных переменных - lower_case. camelCase - это стиль Java.
@@Shmachilin спасибо, я просто смотрел и другие c# уроки, везде не много по разному
@@Shmachilin эм нет, во всех coding conventions (в том числе и от самих microsoft) lower_case никогда не использовался в C#. В C# используют только PascalCase и camelCase, lower_case нет
❤
😀I'm enjoying watching TH-cam.
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?
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 -");
}
}
WPF жив? Если да, то наверно сплошное легаси?
Вы с чего взяли?
@@Shmachilin я не знаю, вот и спрашиваю
На рабочем столе заставка из Eve Online.
Nemesis
качественный материал, то что есть на itdvn невозможно слушать из за зелености самого доклачика и не поставленного голоса.
52:00
Стыдно - ничего не делать!!
И назовём его CV-19. Мне одному это кое-что напоминает?
Что на пример?