Полноценная MVVM-архитектура в WPF-приложениях

  Рет қаралды 30,423

Igor Zimaev

Igor Zimaev

9 жыл бұрын

Когда технология WPF является оптимальным выбором для разработки? Что приводит к разрушению MVVM-архитектуры? Как работает новый Catel, и чем полезен ViewModelToView-конвертер.

Пікірлер: 130
@_aleXela_
@_aleXela_ 9 жыл бұрын
Спасибо, жду другие уроки про Catel
@Mr4Mike4
@Mr4Mike4 8 жыл бұрын
Игорь, спасибо большое за урок! У меня теперь всё прояснилось!
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Mr4Mike4 обращайся) Успехов!
@Dustmadeout
@Dustmadeout 7 жыл бұрын
Подскажите, пожалуйста, почему стандартная процедура создания триггера на главном окне с ивентом Loaded (т.е. ....) не вызывается при загрузке главного окна? Если поставить любой другой ивент, например MouseDoubleClick или KeyDown, то он срабатывает, а вот Loaded - нет. В MVVM Light я вешал ивент Loaded на главное окно, чтобы показать модальный диалог, как это сделать в Catel?
@ivandurakov4030
@ivandurakov4030 9 жыл бұрын
Отлично! Спасибо! Ждём новых уроков. Пожелания: система докирующихся окон типа UI Visual Studio и управление мышью во ViewPort3D объектов типа modelvisual3d и uielement3d. Первый человеческий курс по MVVM и достойному фреймворку. Как это не вопит армия идолопоклонников того неуправляемого монстра MVVM, который задуман с ViewModel - простым объектом с INotifyPropertyChanged. Помню меня чуть не сожрали, когда отстаивал использование зависимых свойств для естественного байндинга. Как же, ViewModel тогда уже элемент UI по их мнению становился...
@advancerkit3994
@advancerkit3994 6 жыл бұрын
В сети - да - очень много материалов. Но толковых практически нет. И по-моему так как вы вообще крайне мало кто умеет объяснять! (мне не попадались) Мне тоже очень понравились ваши уроки. Пока лучшее, что я видел по C#. И очень хотелось бы надеяться на хоть какое-то продолжение! Реально очень круто! Самая суть, самое важное и достаточно подробно и постепенно чтобы понять человеку с минимальной подготовкой. Просто респект!
@IgorZimaev
@IgorZimaev 6 жыл бұрын
Спасибо за отзыв! Другое дело, что, если бы я сейчас сел за уроки, то сделал бы все иначе, очень давно это было, с тех пор я успел поработать по всему миру, совершенно новый опыт. И в один урок это не уместить. Например, 5-10. А эти, существующие 3 видео, тогда удалить что ли? Жаль с одной стороны, много комментариев и просмотров. С другой - они, на фоне новых видео, будут сбивать с толку.
@advancerkit3994
@advancerkit3994 6 жыл бұрын
Нет, нет, на счет этого не беспокойтесь. Люди, кому интересно разберутся что смотреть и с чего начинать! Думаю можно старые и оставить, просто их в отдельный плэйлист. От вас любое видео было бы интересно. Но если хотите можете и удалить, себе на комп я их уже сохранил))) думаю как и многие)
@pavelksenofan6622
@pavelksenofan6622 8 жыл бұрын
зря забросили уроки. У Вас хорошо получается объяснять довольно сложный материал.
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Pavel Basha спасибо, ну для меня было бы стыдно этого не уметь при стаже преподавания и программирования в 10 лет) Другое дело, что я сейчас немного потерял "нишу", в сети очень много курсов, самоучителей, обучающих видео. Правда, некоторые из этих материалов меня приводят в ужас (забивают голову ненужными вещами, а самое важное вообще не говорят) - но чтобы мне на этом фоне как-то выделиться, нужно вложить очень много сил в развитие и популяризацию, фактически создать свою школу программирования. Сейчас я нахожу силы в очень ограниченном объеме вести репетиторство, а львиную долю остального времени съедает работа (как на full-time в компании Acronis, так и по частным заказам из других стран). Пожалуй, максимум, что я могу сделать в обозримом будущем - это снять небольшую серию уроков (штук 10), дай Бог, если они найдут своего зрителя. Только рад поделиться знаниями, но вроде как сейчас острого дефицита в них в сети нет - очень много материалов.
@shmutalov
@shmutalov 8 жыл бұрын
...в?
@IgorZimaev
@IgorZimaev 8 жыл бұрын
преподавал? На курсах второго высшего при Новосибирском государственном техическом университете.
@nikitakrasnikov2970
@nikitakrasnikov2970 7 жыл бұрын
Почему Грид полностью окно не заполняет? Например у меня , а он не заполняет всё окно, т.е остаются белые полосы по краям по 5 пикселей, как будто стоит Margin="5", как это убрать?
@nikitakrasnikov2970
@nikitakrasnikov2970 7 жыл бұрын
решил способом Margin="-5". Все оказалось просто:D
@koshkapes
@koshkapes 6 жыл бұрын
Представим ситуацию. В моем окне приложения есть TextBox содержимое которого двусторонне забиндено на некоторый источник и для этой привязки установлено UpdateSourceTrigger=Explicit. И я хочу чтобы источник этой привязки обновлялся по нажатию кнопки. Я это, по привычке, сделал бы в обработчике события Click для кнопки, вызвал бы UpdateSource() для вышеупомянутого TextBox. Но после просмотренного я в сомнениях. Как это правильно сделать с точки зрения MVVM?
@konstantinbutakov7423
@konstantinbutakov7423 6 жыл бұрын
Вопрос не по видео, ещ пользуетесь WPF и Caliburn или уже что-то другое?
@IgorZimaev
@IgorZimaev 6 жыл бұрын
Для desktop-проектов лучше WPF пока ничего не придумали, а из фреймворков - да, как на Caliburn.Micro остановился, так и использую, много полезных фич в нем. Часто в связке с MahApps.Metro + AutoFac + AutoMapper.
@Anaflion
@Anaflion 5 жыл бұрын
Товарищ Игорь :) Какой сегодня вы посоветовали бы фрйемворк?
@IgorZimaev
@IgorZimaev 5 жыл бұрын
Сегодня я бы посоветовал web-приложение на asp.net core 2 + react ) Но бывает конечно, что нужно именно desktop-приложение. Если к нему есть требования кроссплатформенности, тогда немного печально, я не вижу прям классного решения. C++ Qt, Electron, React Native (ныне моден). Если же Windows, то WPF MVVM - да, а фреймворк я бы взял Caliburn.Micro.
@ivanprodaiko6105
@ivanprodaiko6105 7 жыл бұрын
Подскажите, делал по вашему примеру свой проект,к примеру во View у меня есть еще одна папка Header в которой лежит вьюшка, в ViewModel также создаю папку Header в которую помещаю файл ViewModel, правила именования соблюдаю, но когда нажимаю на кнопку что бы отобразить это представление ничего не происходит, как будто ViewModel ничего не знает о View. Без вложенности папок все работает прекрасно, подскажите в чем может быть проблема, что я делаю не так?
@IgorZimaev
@IgorZimaev 7 жыл бұрын
Если я правильно понял, ViedModel не подключается ко View, если они лежат в разных папках. Вы же во View не указываете явно, какая ViewModel ей соответствует, поэтому Catel сам ищет по совпадению имен, ****View - он ищет ****ViewModel. Не в папке, а в том же namespace, для классов, если говорить о видимости, нет файлов, папок, дисков и пр. - есть только пространства имен. Но когда в проекте вы заводите папки, в них - папки, в них - файлы -в этих файлах namespace будет все эти папки включать в себя. И View с ViewModel окажутся в разных пространствах имен. Поэтому, надо явно задать связь. С Catel давно не работал, надо читать документацию, там вроде 3-4 способа было это сделать, самый простой и в лоб - задать ViewModel внутри View явно, в DataContext. Потом можно переделать.
@ivanprodaiko6105
@ivanprodaiko6105 7 жыл бұрын
спасибо, совет пригодился, понял принцип работы)
@_SkyDancer
@_SkyDancer 9 жыл бұрын
Ок, А получится ли у меня во View использовать например `mahapps.metro` окна вместо стандартных или окон с `Catel`?
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Sky Dancer У того же автора есть проект Orchestra, там Catel и MahApps.Metro интегрированы. Чтобы это сделать самому - придется попотеть, т.к. у MahApps и Catel свои классы для окон. Можно посмотреть исходники Orchestra, можно использовать Orchestra, либо вместо Catel воспользоваться Caliburn.Micro.
@user-py4lz4rm1j
@user-py4lz4rm1j 9 жыл бұрын
Возник еще такой вопрос. Насколько я понимаю, коллекция ObservableCoollection не является потокобезопасной? Мы сами должны заботиться об этом или это решается на уровне фреймоврка? Что будет, если произойдет одновременное редактирование модели через UI и внутренние методы модели?
@IgorZimaev
@IgorZimaev 9 жыл бұрын
Борис Илларионов увы, она не потокобезопасна, т.к. синхронизация требует огромных ресурсов (впрочем, у меня из-за этого не возникало проблем). В UI далеко не всегда ведь возможно добавление/удаление элементов. Отображается список через ListView, а удаление и добавление - кнопками, на которые команды, добавление открывает модальный диалог, где юзер заполняет поля. И все операции идут через ViewModel. Другой вариант - сделать синхронизацию руками. Может в этом вам поможет Catel'евский аналог, класс FastObservableCollection (позволяет делать обновление коллекции пачками, что очень повышает производительность). Ну или сделать на базе потокобезопасных коллекций (начинающихся с Concurent...) наблюдаемую коллекцию, вот тут вроде что-то есть: www.codeproject.com/Articles/208361/Concurrent-Observable-Collection-Dictionary-and-So
@paveldavidouski
@paveldavidouski 8 жыл бұрын
Привет. После просмотра урока возникло сразу несколько вопросов, на которые пока не получилось найти ответов: 1)аналогично примеру в уроке, модно ли сделать так, чтобы сразу вывелся лист слайдов(слайды друг за другом) без регистрации еще одной модели и дополнительного биндинга? 2)если представить, что кнопка из примера, которая меняет слайды, находилась на отдельной view, то тогда как можно было бы организовать ее работу, чтобы сохранить прежний функционал?
@s_kuzmich
@s_kuzmich 7 жыл бұрын
Ролик нужно было назвать "Знакомство с Catel", а не "Полноценная MVVM архитектура" ) все связи должны идти исключительно в одном направлении сверху вниз: View > ViewModel > Model > (DataAccessLayer\DataProvider) > Data msdn.microsoft.com/en-us/library/hh848246.aspx модель не должна знать о существовании ViewModel, ей даже не обязательно знать о существовании WPF для этого есть ивенты, если вдруг внезапно необходимо ;)
@AlexCSharp
@AlexCSharp 5 жыл бұрын
Слушай, не знаешь какие нибудь нормальные самоучители или видеоуроки по MVVM в WPF без всяких кателей и прочего? Тонны говна в интернете и почти ничего толкового. Надо задание выполнить чтоб на работу попасть, а я в MVVM вообще ничего не понимаю.
@sledleo
@sledleo 4 жыл бұрын
Можно писать под свои задачи по-разному, можно и View делать не знающей о ViewModel. А можно их всех делать независимыми, только потом добавляя промежуточный слой для привязки
@andrewsed_uplisten2019
@andrewsed_uplisten2019 4 жыл бұрын
Игорь куда пропал? мы типо ждём серию уроков (штук 10)
@hornermotorbiker4360
@hornermotorbiker4360 6 жыл бұрын
Чуть по-бодрее бы. А так, круто, конечно! лайк от меня.
@user-st3fm6bs5j
@user-st3fm6bs5j 8 жыл бұрын
Игорь, а у Вас нет примера использования MVVM с базой данных?
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Максим Акимов Если говорить именно про Catel, то в нем есть специальная подсистема для работы с EntityFramework: catelproject.atlassian.net/wiki/display/CTL/Getting+started+with+Entity+Framework+in+Catel По самому Entity Framework в сети ОЧЕНЬ много примеров, из своих нашел только вот этот: bitbucket.org/TimeCoder/tradesystem/src/ccc288f70e9741ab144951ff44f0655ce72e4b79/src/DAL/Repositories/?at=master
@user-fe8qr2gq5o
@user-fe8qr2gq5o 4 жыл бұрын
Добрый день! Вы все время повторяете Code-Behind для View не использовать, но приложение WPF не хочет запускаться (Visual Studio 2019) и выдает ошибку без привязки Control-ов к Code-Behind для View (при этом вчера эта ошибка вылезала, я закрыл VS, открыл снова, а ошибки уже нет). Почему происходит такая нестабильная работа?
@IgorZimaev
@IgorZimaev 4 жыл бұрын
Antonbreit Breit добрый день, не видя кода сложно что-то ответить по существу. Вообще нестабильной работы обычно не наблюдается. Попробуйте выложить пример кода на любой ресурс для code sharing.
@dennisinfobox
@dennisinfobox 7 жыл бұрын
У меня вопрос как, с точки зрения не нарушения MVVM архитектуры, отображать на UI изменения в модели если они происходят в другом потоке. Т.е какой как правильно протянуть эти изменения от Модели к ВьюМоделе и от нее ко Вью? Например у нас в контент контроле информация о текущей температуре, а изменения температуры определяется внешним сервисом который в бакграунд потоке меняет нашу модель.
@IgorZimaev
@IgorZimaev 7 жыл бұрын
Самое простое: это событие в модели, на которое подписывается вьюмодель. Когда оно сработало (данные обновились), можно обновить поля во вьюмодели, и они отобразятся во view. Если не заработает, и буде ругаться, что нельзя менять UI из другого потока, то поможет Dispatcher.Invoke. Можно посмотреть в сторону reactive ui.
@radast123
@radast123 7 жыл бұрын
Подскажите как можно также привязать 13:46 isEnable на количество элементов? Привязываю объект вида List к datagrid и по кнопке листаю содержимое объекта.
@IgorZimaev
@IgorZimaev 7 жыл бұрын
Самое простое: использовать триггер stackoverflow.com/questions/18542120/wpf-databinding-with-an-conditional-expression Триггер срабатывает, когда какое-то свойство одного из элементов принимает заданное значение, и при срабатывании можно как угодно изменить стиль другого объекта. Другой путь - конвертер, на вход приходит коллекция, на выходе - bool. Был еще вроде какой-то хитрый вариант записи условия прямо на xaml-языке, но не помню с ходу, и в любом случае это не универсальный подход (рано или поздно его не хватит).
@radast123
@radast123 7 жыл бұрын
Спасибо за помощь. С этим у меня все получилось. Возникла еще проблема. Есть не редактируемый combobox. На него забиндил ObservableCollection и SelectedIndex. При удаление элементов из коллекции SelectedIndex принимает значение -1. На этот индекс у меня прикреплен элемент массива (ObservableCollection), которые отображаются в форме, а соответственно -1 элемента нет в массиве и ловлю ошибку. Я пробовал записывать в SelectedIndex = 0 при обновление ObservableCollection и соорудил if в свойстве set для SelectedIndex, но для первого варианта SelectedIndex = -1 устанавливается раньше и вылетает ошибка, а для второго варианта измененный SelectedIndex не отображаются на View. Надеюсь, что вы найдете время чтобы вникнуть мою проблему и помочь мне!
@IgorZimaev
@IgorZimaev 7 жыл бұрын
Adrug А если вместо SelectedIndex использовать SelectedItem (который будет становиться null)?
@radast123
@radast123 7 жыл бұрын
Спасибо еще раз получилось. Вопросов миллион конечно еще, но думаю будет слишком нагло спрашивать еще.
@IgorZimaev
@IgorZimaev 7 жыл бұрын
Спрашивайте, отвечу по возможности.
@mrPahanbl4
@mrPahanbl4 9 жыл бұрын
Очень удобно использовать Catel.Fody для автоматического формирования свойств. Отпадает надобность использования vmprop и иже с ними))
@pavelvasilevich
@pavelvasilevich 7 жыл бұрын
Подскажите, как изменить стиль кнопок в DataWindow?
@IgorZimaev
@IgorZimaev 7 жыл бұрын
Вот тут есть подробное описание с примерами: catelproject.atlassian.net/wiki/display/CTL/Window+and+DataWindow#WindowandDataWindow-Customizingthebuttons
@shaoshur7517
@shaoshur7517 8 жыл бұрын
Сорри за нубский вопрос, но от куда был взят интерфейс IUIVisualizerService?
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Изя Шниперсон В этом вся соль Dependency Injection, а конкретнее внедрение через конструктор. В сложных проектах, где много модулей (т.е. проектов, на выходе дающих свою dll) между ними часто возникают зависимости. Если два модуля будут ссылаться друг от друга, придется делать явные ссылки, и программа не соберется: ошибка циклической зависимости. Поэтому используется DI, в чистом WPF его конечно нет, он реализован в различных фреймворках, в данном случае - Catel. Каждый модуль регистрирует при старте свои классы, реализующие некие интерфейсы, а потом в любом модуле можно запросить этот интерфейс - и придет объект, его реализующий (можно настроить, один ли это объект на всех, или каждый раз создается новый). Catel по этой же схеме предоставляет свои интерфейсы для разного рода плюшек, они называются сервисы. Есть разные способы, как их получить, самый простой - указать как параметр конструктора. Важно, что объекты этого класса (ViewModel) мы не создаем сами с помощью new, иначе пришлось бы указать этот параметр при создании. Объект ViewModel главного окна создает сама система. Фреймворк видит, что конструктор ждет на вход интерфейс такой-то, и подает ему нужный объект. Это очень удобно. Подробнее о сервисах Catel: catelproject.atlassian.net/wiki/display/CTL/Services Можно использовать этот подход и в тех случаях, когда мы сами создаем объект (ViewModel, или любой другой), и хотим чтобы запрашиваемые сервисы были автоматически подтянуты. Просто вместо new придется использовать другой способ: var viewModel = TypeFactory.Default.CreateInstanceWithParametersAndAutoCompletion(); Подробнее: catelproject.atlassian.net/wiki/display/CTL/Dependency+injection
@AlgPortfolio
@AlgPortfolio 7 жыл бұрын
Здравствуйте! У меня не получилось установить catel templates через online -> c# -> WPF. Templates для Кателя просто не было найдено. У меня стоит VS 2017. Вручную скачала отсюда catelproject.com/downloads/general-files/ Но не оставляет ощущение что это возможно устаревшие файлы. Подскажите пожалуйста, правильно ли я сделала и почему не получилось установить templates к у Вас?
@krisskross4094
@krisskross4094 7 жыл бұрын
Добрый день! Попробуйте от сюда github.com/Catel/Catel/issues/1022 скачать. И в ручную скопировать файлы %USERPROFILE%\Documents\Visual Studio 2017\Templates\. У меня после этого появились все шаблоны в VS2017
@user-py4lz4rm1j
@user-py4lz4rm1j 9 жыл бұрын
В таком случае, хотелось бы посмотреть видео на каком-нибудь примере вроде списка аккаунтов, у каждого из которых есть свой динамический статус вроде "онлайн", "отошел" и статическим логином с паролем. А также сохранением добавленных пользователем аккаунтов в БД (для простоты можно взять сериализацию в файл). Если я правильно понимаю, список аккаунтов должен лежать в модели и именно она должна реагировать на изменения статуса определенного аккаунта от абстрактного сервера и сообщать это каким-то образом VM, которая, в свою очередь через биндинг отобразит это в "таблице" на экране? Заодно, в данном примере будет интересно посмотреть на реализацию контекстного меню и вычисления ячейки в "таблице" по которой щелкнули (например для удаления текущей строки/аккаунта или его изменения). Таким образом, можно будет рассмотреть и обратный способ связи: от вью до модели. Как бы понятно, что через биндинг состояние VM изменится, но как внести изменения в модель? (сообщить, что для конкретного аккаунта нужно послать сообщение серверу о дисконнекте и удалить его из листа). Вешать ивент на изменению VM (обычный подход) или есть способ сделать это более красиво текущими технологиями?
@IgorZimaev
@IgorZimaev 9 жыл бұрын
Борис Илларионов Постараюсь, как в работе более-менее окошко времени появится. Да, все правильно, но насчет оповещения модели тут есть важный момент. Если на каждое изменение в UI отправлять данные на сервер (БД, либо сервер приложений) - сервер (или сеть, смотря где узкое место) ляжет от нагрузки. Изменения нужно группировать в пакеты, т.е. накапливать, а потом пачкой записывать. Почитайте про паттерн UnitOfWork.
@user-py4lz4rm1j
@user-py4lz4rm1j 9 жыл бұрын
Что-то никак не могу понять для чего тогда нужна модель при таком подходе? Что в ней может храниться и как правильно связать с VM?
@IgorZimaev
@IgorZimaev 9 жыл бұрын
Борис Илларионов зависит от конкретного случая. Смотрите, ViewModel - это ведь по-сути всего лишь набор данных, подготовленных для отображения (или полученных от пользователя), это своего рода информационный срез того, что находится во View. Отсюда можно сказать, что ViewModel очень близка ко View, гораздо ближе, чем к Model. Поэтому между Model и ViewModel можно УСЛОВНО провести черту, деляющую всю архитектуру на две большие части: логика и визуальное представление. Поэтому в Model по идее уезжает ВСЯ ЛОГИКА, т.е. обработка данных, вычисления, и все то что делает вашу программу собой. И над моделью появляется еще один слой: DAL, источник данных. Это просто разные срезы. Практически во всех случаях архитектура приложения состоит из 3-х больших слоев: DAL (данные) + BL (основные объекты предметной области, логика, бизнес-модель, вычисления, алгоритмы) + Presentation. А MVVM - это немного другой срез, показывающий как именно отделить данные и представления в WPF. Model относится к BL, а ViewModel и View - к Presentation. Как получить данные модели и поместить обратно - сильно зависит от задачи. В простейшем случае, ViewModel имеет ссылку на Model, извлекает от туда нужные данные в свои поля (и они отображаются вщ View, а при действиях пользователя, инициируемых, например, командами (нажал Save) - наоборот, записываем данные в модель. Если в какой-то момент нужно что-то посчитать - вызываем метод в моделе. Другое дело, что в многопользовательской среде, например, модель может вдруг сама изменится, и нужно чтобы ViewModel это узнала. Много способов. Подписка на события, или те же биндинги. Вот в Catel как раз такая идеология, там между Model и ViewModel есть биндинги, как и между ViewModel и View, т.е. там модель не совсем "чистая", в ней присутствует механизм биндингов (относящийся все-таки к UI-технологиям).
@user-st3fm6bs5j
@user-st3fm6bs5j 8 жыл бұрын
using Catel.Core; using Catel.MVVM; using System.Threading.Tasks; public class MainWindowViewModel : ViewModelBase { private readonly IUIVisualiserService _visualiserService; Вот так объявлено, и не видит тип IUIVisualiserService.
@user-st3fm6bs5j
@user-st3fm6bs5j 8 жыл бұрын
Студия не видит тип IUIVisualiserService, тот тип из Catel?
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Максим Акимов Да, из Catel. Убедитесь, что Catel.Core и Catel.MVVM закачены через NuGet, ну и using нужный есть. И убедитесь, что в IUIVisualiserService в начале стоит буква I, тоже частая ошибка, мы запрашиваем именно интерфейс, а его реализация - закрыта в недрах Catel.
@IgorZimaev
@IgorZimaev 7 жыл бұрын
т.е. разница с примером в том, что ContentControl и кнопка находятся не в одной ViewModel? Тут много вариантов, зависит от того, как в целом эта Parent-Child связь выстроена (между ViewModel окна и находящегося в ней контрола). Нажали на кнопку, находимся во ViewModel окна - что мешает обратиться напрямую к ViewModel контрола (мы ее можем сами создавать, и также через конвертер отображать в ContentControl соответствующий контрол)? Вызвать там метод переключения слайда и пр. Или наоборот, в контроле подписаться на некое событие, которое инициируется в основном окне. Но тут стоит над архитектурой подумать, без конкретной задачи это очень абстрактные рассуждения.
@konstantinbutakov7423
@konstantinbutakov7423 7 жыл бұрын
попробую взять Ваш пример. Есть главное окно: 2 ContentControl и кнопка кнопка биндится к : public ICommand sw { get {return new Command(() => { cursld = slideList[1]; });} } где: public IViewModel cursld { get { return GetValue(cursldProperty); } set { SetValue(cursldProperty,value);} } и slideList=new List { new oneViewModel(), new twoViewModel(), }; где oneViewModel и twoViewModel пустые usercontrol-ы отличающиеся только цветом фона, в первом еще есть кнопка. cursld и othersld похожи: public IViewModel cursld { get { return GetValue(cursldProperty); } set { SetValue(cursldProperty,value);} } public static readonly PropertyData cursldProperty = RegisterProperty("cursld", typeof (IViewModel), null); при нажатии кнопки в главном окне все хорошо ( cursld = slideList[0];) но как сделать чтобы при нажатии кнопки в oneViewModel() сделать (othersld = slideList[1];)
@konstantinbutakov7423
@konstantinbutakov7423 7 жыл бұрын
Вот вы говорите, что много примеров в сети, но Ваши уроки мне сильно помогли в понимании, очень доходчиво, аналогов гугл не предлагает! Попробовал сделать подобное без catel www.cyberforum.ru/wpf-silverlight/thread1878436.html но вышла какая-то ерунда, такое ощущение что упустил мелочь
@IgorZimaev
@IgorZimaev 7 жыл бұрын
А можно код проекта куда-то выложить? На GitHub, ну или хотя бы архив в облако.
@MrStreamdown
@MrStreamdown 8 жыл бұрын
Добрый вечер. Будут ли продолжения по Catel?
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+MrStreamdown Обязательно, хотя бы 2-3 урока, постараюсь до нового года найти время. А потом, скорее всего, пойдет тема web-программирования.
@MrStreamdown
@MrStreamdown 8 жыл бұрын
+Igor Zimaev (TimeCoder) А можно ещё поинтересоваться. Выбор за этот фреймворк - это был выбор компании, а вы просто хорошо его изучили? Чем не подошли другие: MVVM Light к примеру.
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+MrStreamdown История была такая. Я тогда работал еще в Новосибирске, компании 2ГИС (карта + справочник), и запускался новый проект для управления рубрикатором. Проекты внутренние все на C#. Кто его запускал - выбрали Catel, я позже к проекту присоединился, ну и мы не пожалели. MVVM Light на то и Light, что он ОЧЕНЬ простой. Даже не 1/10 часть от Catel. По крайней мере на тот момент Catel был самым прогрессивным MVVM-фреймворком (не думаю, что сейчас что-то поменялось, просто я уже не так сильно слежу за миром desktop-разработки). Конкретно для нас Catel обладал такими ценными плюшками: 1. Компактное объявление зависимых свойств, особенно когда из них выстраивается цепочка. Приложение сложное, много окон, поменяли что-то в одном месте - и как по волшебству изменение прокатилось везде, где надо (т.е. из ViewModel ушло автоматом в Model, а оттуда - во все подписанные на это другие ViewModel). Если использовать Catel.Fody, то код еще лаконичнее. 2. Очень полезная штука Catel.Memento, т.е. добавление функционала Undo/Redo в пару строк кода. 3. Catel.Prism использовался для регионов, т.е. когда окно приложения состоит из областей, содержимое каждой из которых формируется динамически, без жестких зависимостей в коде. 4. В Catel много удобных готовых конвертеров (для binding'а), несколько видов команд (для действий), все это хорошо продумано. Понятно, что мы не в сказке живем, есть в Catel и баги, на которые периодически натыкались, но в целом скорее позитивный опыт. Т.е. для более-менее сложных проектов, сложных либо по UI (много конвертеров, команд, поведений, attach-properties и пр.), либо по архитектуре (много модулей, которые нужно гибко соединять) - Catel будет удобен, в нем многое есть уже готовое, там реально ОЧЕНЬ много всего. Для простых проектов, можно и MVVMLight. Но я как-то уже привык к Catel, и заранее не всегда понятно, как будет меняться сложность проекта, а менять фреймворк опосля - крайне кропотливая работа. p.s. загадкой для меня осталось лишь одно - почему про Catel практически никто не слышал. Когда искал работу в Москве, на собеседованиях упоминал - никто не сталкивался, но интерес проявляли.
@MrStreamdown
@MrStreamdown 8 жыл бұрын
+Igor Zimaev (TimeCoder) Спасибо за столь развёрнутое объяснение. Есть ещё некоторые пожелания :) Может получится у вас осветить их хотя-бы парой слов: 1) Те самые зависимые свойства. Желательно на примере сложнее чем textblock)) к примеру Listview на нескольких формах. 2) Немного про EventTrigger 3) Немного про связи с базами данных хотя бы чисто обзорно. К примеру в комплексе с EF. Это чисто пожелания.
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+MrStreamdown ок, принял. Не понял только в п.1: listView на нескольких формах - в каком смысле? Одни и те же данные в нескольких окнах?
@AnrelD
@AnrelD 2 жыл бұрын
Актуальна ли эта информация для 2022 года?
@IgorZimaev
@IgorZimaev 2 жыл бұрын
Принципы MVVM не изменились, но сама платформа .net и фреймворки ушли вперёд. Судя по сайту Catel, он поддерживает .net core 3, это не самая последняя (но и не самая старая) версия .net. Вполне можно использовать такую версию .net, и Catel тоже (хотя мне после Catel доводилось работать с Caliburn.Micro, он понравился даже больше). Но, если смотреть в будущее, стоит помнить о новой технологии десктопной разработки: .net MAUI. Она пока сырая, но со временем, наверное, будет в ходу (и работать на всех платформах). Не уверен, что под неё есть фремворки типа Catel. Я бы сейчас предпочёл вообще не использовать фреймворк, если это сильно не тормозит разработку. Но сами принципы mvvm, конечно, остались те же.
@AnrelD
@AnrelD 2 жыл бұрын
@@IgorZimaev Есть старый проект на WPF и . Net Framework 4.6.1. Написан ужасно, но активно используется и требует поддержки. Я его сейчас привожу в порядок, но не использую сторонние фреймворки, чистый MVVM. Иногда просматриваю в сторону Prism, Caliborn, и вот наткнулся на Catel... Ну может действительно не тратить время на это и надеятся что в будущем вообще перейдем на новую технологию.
@bog_roman
@bog_roman 7 жыл бұрын
рассказчик засыпает или боится микрофона?
@IgorZimaev
@IgorZimaev 7 жыл бұрын
Нет, выступать я не боюсь, 10 лет преподавания за спиной. Уроки записывал ночью, после работы, и говорил не громко, чтобы никого не разбудить.
@ori-d
@ori-d 8 жыл бұрын
Странно, но у меня не работают ни кол бек методы, ни инициализация, просто пустое окно, если я загружаю контент через contentcontrol, В чем проблема?
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Mikhail Gribkov могу сказать только увидев код) Вот тут удобно выкладывать: gist.github.com
@ori-d
@ori-d 8 жыл бұрын
Oops, Нашел ошибку, нужно было из конструктора убрать UIVisualizerService =) Видео отличное, спасибо =)
@alexeymekhanoshin682
@alexeymekhanoshin682 8 жыл бұрын
В новых версия, как я понял, рекомендуют использовать префикс Async, что-то типа этого: using Catel.Services; // Для ''IUIVisualizerService' и т.п. ... public Command ShowDialogCommand { get { return new Command(async () => { var dialog = new DialogViewModel(); bool? x = await _visiualizerService.ShowDialogAsync(dialog); if (x == true) { await _messageService.ShowInformationAsync(dialog.Name); } }); } } Источник: catelproject.com/2015/03/14/released-catel-4-1-0/
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Mekhanoshin Alexey В общем да. Это асинхронные версии функций, предназначенные для async+await вызовов. Вот небольшой пример: github.com/TimeCoder/DotNet/tree/master/src/AsyncDemo
@user-hg4qf1go5f
@user-hg4qf1go5f 4 жыл бұрын
Здравия, товарищи Есть кто может на вопрос ответить по wpf? не могу ответ найти
@IgorZimaev
@IgorZimaev 4 жыл бұрын
Даниил Чернюк задавайте
@user-hg4qf1go5f
@user-hg4qf1go5f 4 жыл бұрын
@@IgorZimaev я хочу написать приложение, в основном меню есть поле контейнер со структурой есть основное окно меню и побочное для ввода значения структуры ( 2 string и 3 int) там текстовые блоки, ввожу значения Как мне из побочного окна или обратиться к полю основного окна или передать данные инфо поля?) (Нажатием кнопки на побочном окне добавить элемент с такими полями в контейнер, который является полем в основном окне, в коде С#)
@user-hg4qf1go5f
@user-hg4qf1go5f 4 жыл бұрын
если сократить как обратиться из побочного окна к переменной в основном окне? this. Owner. data пишет нельзя на data что-то не то с областью видимости
@IgorZimaev
@IgorZimaev 9 жыл бұрын
@rus79k26
@rus79k26 9 жыл бұрын
Igor Zimaev А как использовать Catel в универсальном приложении?
@IgorZimaev
@IgorZimaev 9 жыл бұрын
Руслан К А что такое универсальное приложение?
@rus79k26
@rus79k26 9 жыл бұрын
Igor Zimaev Универсальные приложения для Windows и Windows Phone msdn.microsoft.com/ru-ru/dn659708.aspx
@IgorZimaev
@IgorZimaev 9 жыл бұрын
Руслан К А, вон оно что. Честно - не пробовал, не очень привлекает сама идея, если уже писать под mobile, то хотя бы охватить и Android тоже (например, Xamarin, с которым Catel дружит: github.com/Catel/Catel.Examples.Mobile). Работать должно, начиная с 4-й версии, это есть в release notes: catelproject.com/2014/11/17/released-catel-4-0-0/ Они уже и под Windows 10 делают доводку: catelproject.atlassian.net/browse/CTL-614
@rus79k26
@rus79k26 9 жыл бұрын
Igor Zimaev Спасибо, в примере для Xamarin нашел ответ. Хотелось бы в уроках по Catel узнать больше фич, например как Catel помогает работать с валидацией данных введенных пользователем, и что такое Locator.
@user-st3fm6bs5j
@user-st3fm6bs5j 8 жыл бұрын
Хммм (((. Catel.Core и Catel.mvvm установлены
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Максим Акимов Без кода ничего не могу сказать, может опечатка в одну букву где. Вот пример с IUIVisualizerService, который я делал для этого урока, выкачайте его и попробуйте собрать: github.com/TimeCoder/DotNet/blob/master/src/BooksLibrary/ViewModels/MainViewModel.cs
@minskowl
@minskowl 5 жыл бұрын
Стоило бы тайминги выложить в комментах. А то слишком много разношерстной информации. Сел послушать про Catel и просрал 40 минут. Для секретности кода есть платные обфускаторы после которых декомпильнытй код вам не удасться скомпилировать. На быстродействие они никак не влияют. Они переименовывают все private и protected члены на минимально короткие и разрешимые IL имена. И эти имена потом C# копилятор вообще не понимает.
@bulsond
@bulsond 8 жыл бұрын
Во всех англоязычных курсах используют POCO модель с реализацией INotifyPropertyChange в свойствах, а для коллекций используют ObservableCollection, вот смотрю уже второй курс на русском, и все недоумеваю: а нафига вы все используете DependencyProperty, а? Некоторые еще умудряются модель или ViewModel унаследовать от DependencyObject! Зачем это делается русскими програмерами? Эта наша такая российская сермяжная правда, городить огород из плохо читаемого кода? Или в этом есть какая-то сакральная вера, что раз все контролы унаследованы от DependencyObject, то вполне естественно свойства модели сделать подобными контролам?
@IgorZimaev
@IgorZimaev 8 жыл бұрын
Почитайте, для начала, вот это: msdn.microsoft.com/en-us/library/bb613546.aspx и вот это: codemonkeycorner.com/post/wpf-dependency-properties-vs-inotifypropertychanged В общем, у всего есть свои плюсы, в корпоративном софте, где требуется крайне высокая производительность - побеждает DependencyProperty подход. Составители курсов (хоть англоязычных, хоть русскоязычных) как правило далеки от реальных задач. В Catel используются свои, более лаконичные в объявлении (чем классические из WPF) dependencyProperty, и я не вижу причин вместо них вручную в set-аксессоре вызывать нотификацию. Код особо читаемее не станет. Но допустим, что это не так. Если вы будете делать INotifyPropertyChanged на чистом WPF, то там свойство задается строкой - т.е. при переименовании переменной все сломается. Тогда вы возьмете хотя бы минимальный MVVM-фреймворк, такой как MVVM Light - то там уже через лямбда-выражения задается свойство, отлично. Потом, сделав еще пару шагов, вы увидите, что в таком фреймворке много чего не хватает, и возьмете что-то мощнее: Catel, CaliBurn.Micro и пр. И в каждом из них своя экосистема, свои подходы. В Catel на тот момент был именно такой подход, как в видео, чуть позже стала распространятся такая штука как Fody. Я уже давно не использую ни Catel, ни DependencyProperty - только Fody, благодаря которому все свойства остаются в одну строку кода, и оповещают о своих изменениях сами. Сейчас уже все примеры Catel строятся аналогично. Так что не могу как-то прокомментировать ваши националистические претензии - во всех странах разработчики делают иногда правильно, иногда нет, в США так вообще WinForms сплошной используют - что ж теперь? Все это мелочи, если человек понимает главные принципы разработки. И у русских программистов с этим в целом все хорошо.
@bulsond
@bulsond 8 жыл бұрын
+Igor Zimaev Посмотрите это видео с 07:28 channel9.msdn.com/Shows/Visual-Studio-Toolbox/MVVM-Best-Practices там как раз дается 6 причин по которым использовать наследование от DependencyObject и propdp не следует, особенно рекомендую обратить внимание на пример с Thread affinity. Странно, что в моих высказываниях вы усмотрели какие-то националистические нотки! Я сам русский и живу в России. Дело в том, что изучение XAML & WPF я начал с англоязычных материалов, а когда ради любопытства решил глянуть русскоязычные источники, то натолкнулся на такой необычный способ реализации MVVM. И что совсем уж меня удивляет в русскоязычных курсах так это манера подачи материала: обычно и естественно было бы увидеть реализацию патерна "От простого к сложному", но русскоязычные авторы курсов не утруждают себя этим, сразу с места в карьер, сразу propdp, без объяснения, что это и для чего, из чего состоит и проч. Вот что меня больше всего задело.
@IgorZimaev
@IgorZimaev 8 жыл бұрын
Dem Bulson По поводу POCO vs. DependencyProp - это холиварная тема. Много материалов в сети, доводов в обе стороны. Сам по себе этот факт (аналогично Windows vs Linux, Intel vs AMD и пр.) говорит о том, что единственно правильного решения здесь нет (иначе оно бы естественным образом вытеснило бы неправильное), оба подхода имеют право на существование, важно понимать, в каком случае какой из них уместен. Касательно сложности видео - так это не видеокурсы же. Всего лишь 3 видео, которые я снял много лет назад для студентов, которым преподавал ООП, как сопровождение для одной из лабораторных. Т.е. я это и не позиционирую как пошаговый tutorial, от азов к вершинам. Есть, конечно, мечта сделать такое, но времени пока не хватает.
@bulsond
@bulsond 8 жыл бұрын
Igor Zimaev Я понял, спасибо.
@shmutalov
@shmutalov 8 жыл бұрын
По поводу переименований переменной, nameof наверное должен помочь. Пожалуйста, сделайте видео об использовании Fody. Спасибо. UPD: А где можно взять слайды?
@itcloudguy
@itcloudguy 4 жыл бұрын
Что за "Ви-Пи-Эф"? VPF что-ли? Не слыхал о такой технологии.
@artyombelousovig4901
@artyombelousovig4901 4 жыл бұрын
Ты на Руси живёшь или хде , бусурманин?
@KALMAPUK
@KALMAPUK 6 жыл бұрын
досмотрел до 15 минуты -> абсолютно бесполезное...
[C#] WPF MVVM. Реализация
13:44
BashkaMen Programming
Рет қаралды 66 М.
Василиса наняла личного массажиста 😂 #shorts
00:22
Денис Кукояка
Рет қаралды 10 МЛН
ИРИНА КАЙРАТОВНА - АЙДАХАР (БЕКА) [MV]
02:51
ГОСТ ENTERTAINMENT
Рет қаралды 11 МЛН
Always be more smart #shorts
00:32
Jin and Hattie
Рет қаралды 45 МЛН
WHO DO I LOVE MOST?
00:22
dednahype
Рет қаралды 82 МЛН
Уроки WPF. Паттерн MVVM
23:39
Программирование - это просто
Рет қаралды 86 М.
WPF C# Professional Modern Flat UI Tutorial
36:44
Payload
Рет қаралды 796 М.
Программирование на C#. Работа с WPF
49:28
Intro to WPF: Learn the basics and best practices of WPF for C#
1:10:34
LifeTime 1.0.0.12
0:55
Igor Zimaev
Рет қаралды 8 М.
Василиса наняла личного массажиста 😂 #shorts
00:22
Денис Кукояка
Рет қаралды 10 МЛН