Программирование на C#. Использование Catel

  Рет қаралды 10,504

Igor Zimaev

Igor Zimaev

10 жыл бұрын

В видео показаны основы работы с фреймворком Catel, позволяющего при минимуме кода создавать современные WPF-приложения с множеством окон, валидацией, индикаторами загрузки и многим другим.

Пікірлер: 55
@user-yl1tp5ty2s
@user-yl1tp5ty2s 8 жыл бұрын
Нашел. Спасибо)
@IgorZimaev
@IgorZimaev 9 жыл бұрын
Уроки я сам записал. Есть еще Программирование на C#. Урок 1 и Программирование на C#. Работа с WPF Вообще я учу программированию, а это так, для наглядности записал, не было цели создать прям видеокурс. Но может как-нибудь сделаю.
@_aleXela_
@_aleXela_ 9 жыл бұрын
Видел все три урока, мне понравилось. Хотелось бы побольше про Catel и WPF
@alexnick183
@alexnick183 9 жыл бұрын
Igor Zimaev Молодец! Давай, продолжай в том же духе!
@user-ul7pm1tb5x
@user-ul7pm1tb5x 8 жыл бұрын
+Igor Zimaev (TimeCoder) Очень здорово все объясняешь! Заинтересовал фреймворк и вообще WPF. Интересно было бы узнать еще о возможностях Catel. Спасибо за эти видео!
@marsifox
@marsifox 8 жыл бұрын
Поскольку Вы учите других, то, пожалуйста, говорите студентам (слушателям) про WPF не "вэ-пэ-эф", а "даб-пи-эф". Это приучает к правильному восприятию сокращения и его произношению, что важно при прослушивании английской речи. Прослушал дальше. Ошибки в произношении и других слов( Это усложняет восприятие... "Я не англичанин, я просто учусь") Исхожу из факта, что переучиваться - имею ввиду и Вас, как источник знаний, - всегда сложнее. А построение лекции (речь, план) - очень хорошее, т.е. цельное и воспринимаемое. Значительно сокращает расстояние до применения на примере и собственной практики. Спасибо!
@IgorZimaev
@IgorZimaev 8 жыл бұрын
marsifox Вы совершенно правы! Дело в том, что видео было записано довольно давно, после этого прошло много событий, я переехал в Москву, работал в международных компаниях, и по частным заказам из других стран, и относительно того периода, когда я преподавал и делал ролики - значительно улучшил английский и узнал несравнимо больше о принятых в международной практике терминах, подходах и пр. Но что делать со старыми видео? Жаль их удалять, много просмотров и комментариев. Редактировать существующие видео ютуб, увы, не позволяет.
@_aleXela_
@_aleXela_ 9 жыл бұрын
Большое спасиба. А еще уроки есть? Интересует WPF и Catel. Откуда эти уроки?
@user-yt4oi3oz1e
@user-yt4oi3oz1e 8 жыл бұрын
Очень годные уроки! Жалко что так мало. А как можно поменять текст сообщения об ошибках, который Catel генерирует когда используется валидация, как в вашем приере?
@nngogol244
@nngogol244 7 жыл бұрын
Великолепный урок. Спасибо! Вопрос: Есть view под названием AView. В нем есть ListView с детьми. Дети - это объекты, у которых 3 поля (типа Name, Age, Width). Само собой я вывожу только нужные поля - name и age (переделав ListView.ItemTemplate). + есть AViewModel, где живут дети для списка - childrensForListView, и ещё одно свойство zakaz. КАК связать или вытащить конкретное поле выбраного елемента в ListView и закинуть только его в zakaz.myField ?
@IgorZimaev
@IgorZimaev 7 жыл бұрын
Спасибо! Из коробки есть только SelectedItem, т.е. вся строка. Вам же нужен отдельный cell. Во-первых, добейтесь, чтобы выделение вообще визуально срабатывало для ячейки, а не строки, такая опция есть (SelectionMode, или типа того). Возможно, что ListView сработает, в крайнем случае придется взять DataGrid. А дальше - сначала нужно понять, как бы это заработало без MVVM, прямо в CodeBehind, где напрямую можно обращаться к элементам визуального представления. Потом перенести это решение в MVVM. Думаю, тут только один вариант: использовать Behaviour. Может уже написанный можно найти, поищите в гугле по строке wpf datagrid get selected row cell value mvvm
@_aleXela_
@_aleXela_ 10 жыл бұрын
А где скачать пример, в видео сказано что можно будет скачать
@user-yq2hi5dd5k
@user-yq2hi5dd5k 8 жыл бұрын
Здравствуйте Игорь. Будут ли еще уроки по Catel с примерами, мне видео очень понравилось, всё понятно и доступно объясняете. Вы говорили что это для курсов, не подскажете что это за курсы и можно ли их пройти он-лайн? И такой вопрос по Catel: как и когда происходит сохранение модели? У меня следующая проблема - я из MainWindow открываю еще одно окно SubWindow, редактирую модель, после чего закрываю SubWindow через свою кнопку, которая вызывает метод CloseViewModelAsync(true); . После закрытия в MainWindow отображются измененные данные. Если после этого еще раз открыть SubWindow и закрыть окно “крестиком” модель сбрасывается в самый первоначальный вид. Как закрывать SubWindow, чтобы сохранялась модель?
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Сергей Андропов Здравствуйте, Сергей. То были курсы проф. переподготовки по программированию на второе высшее образование при Новосибирском государственном техническом университете. Уже год как я в Москве, и там, соответственно, не преподаю. Продолжить обучать, уже на новом уровне, желание большое, но здесь и так много разных курсов, город вообще перегружен услугами и фирмами. Поэтому хочу начать онлайн-обучение программированию, надеюсь, что в начале след. года. В Catel каждая ViewModel по умолчанию сериализуется. Т.е. если открыть дочернее окно, что-то там наредактировать, и закрыть крестиком - восстановятся первоначальные значения. А если нажать OK, или вызвать метод закрытия (по памяти не воспроизведу, что-то типа Close или CloseWindow, или OnOk) - то тогда значения сохранятся. Иными словами, есть 2 сценария закрытия окна: Ok и Cancel, второй откатывает изменения. Вообще, по умолчанию все Catel-окна имеют как раз эти 2 кнопки. И вся эта логика, на мой взгляд, абсолютно верная - если OК, то надо сохранить, если Cancel или крестик - это отмена изменений в окне, не вижу смысла что-то в этой логике менять.
@AndreyBarykin
@AndreyBarykin 9 жыл бұрын
Помогите найти пример с заменой стандартного контейнера в Catel на Unity. Не могу найти. Очень надо. Спасибо.
@user-yl1tp5ty2s
@user-yl1tp5ty2s 8 жыл бұрын
Игорь, спасибо за урок. Очень интересно. Спасибо. А где можно скачать исходник примера?
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Александр Ланин Рад, что понравилось) Спасибо за комментарий, добавляет мне уверенности, что нужно все-таки засесть за это дело плотно, отснять полный курс по WPF и ASP.net, и сделать онлай-школу разработки. Тот пример здесь должен быть, проект BooksLibrary: github.com/TimeCoder/DotNet/tree/master/src
@user-yl1tp5ty2s
@user-yl1tp5ty2s 8 жыл бұрын
+Igor Zimaev (TimeCoder) Игорь, если сделаете, будет здорово)) У меня программирование - это хобби, что бы мозги не ссыхались ... Благодаря Вам я полностью изменил подход к написанию на WPF. Описать внутреннюю логику работы устройства, без проблем. А вот привязать WPF проблема. Но благодаря Вашим уроком практически все получилось. Спасибо)) Творите еще. Благодаря таким людям как Вы, гораздо легче осваивать примудрости программирования. С уважением, Алесандр
@user-yl1tp5ty2s
@user-yl1tp5ty2s 8 жыл бұрын
+Александр Ланин youtube
@VildarH
@VildarH 7 жыл бұрын
Добрый день Игорь. Спасибо за уроки. Пробую освоить Catel, на примере проекта BooksLibrary. А почему может не работать отмена в диалоговом окне? Команда Edit: Command edit; public Command Edit { get { return edit ?? (edit = new Command(() => { PersonViewModel personViewModel = new PersonViewModel(SelectedPerson); _uiVisualizerService.ShowDialog(personViewModel); }, () => SelectedPerson != null)); } } Но, у меня после редактирования объекта в диалоговом окне, при нажатии Отмена, не восстанавливается объект в состояние до вызова диалога. В чем может быть причина? Catel 4.5.3
@VildarH
@VildarH 7 жыл бұрын
Причина оказалась в конструкторе класса модели - добавил конструктор без параметров и заработало. Напоминает требования к классам для сериализации.
@IgorZimaev
@IgorZimaev 7 жыл бұрын
Спасибо) Хорошо, что разобрались. Да, в Catel по умолчанию включен механизм сериализации (которая требует констуктор без параметров, все верно), т.е. в дочернем диалоге меняется оригинал объекта, а его сериализованная копия хранится в памяти, и при нажатии отмены - состояние восстанавливается. Много лет уже с Catel не работал, так что с ходу не подскажу, где этот механизм можно отключить (если нужно).
@IgorZimaev
@IgorZimaev 10 жыл бұрын
Вот тут можно скачать: github.com/TimeCoder/DotNet
@Psyonic000
@Psyonic000 8 жыл бұрын
Где вы преподаете?) Хотел бы поучиться у вас. Скажите, catel актуален на данных момент?
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Psyonic000 Преподавал в Новосибирском государственном техническом университете на курсах получения 2-го высшего образования (с 2006 по 2014 год), но потом уехал работать в Москву, и более, к сожалению, не преподаю. Немного занимался репетиторством по skype после этого, но очень эпизодически, со временем свободным напряженно. Насчет Catel - где-то в комментариях (может не к этому видео) я уже отмечал, что стоит попробовать разные фреймворки. Catel развивается, вот буквально месяц назад общался с Geert van Horrik (автор Catel, не уверен как по-русски правильно прочитать) на предмет поддержки фич C#6 в Catel, он работает, и любой желающий может сделать свой вклад в код. В Catel есть ряд интересных фич, которые больше я нигде не видел. Но некоторые полезные и удобные штуки естьв других фреймворках, сейчас я чаще использую Caliburn.Micro. Надеюсь, скоро дойдут руки снять видеоурок про него.
@Psyonic000
@Psyonic000 8 жыл бұрын
+Igor Zimaev (TimeCoder) Сделайте пожалуйста видео обзор и пример современного кателя? Интересует конкретно плагин Catel.Fody, ну и остальные изменения.
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Psyonic000 так это современный Catel в видео) Даже если там версия 3 (не помню уже), то отличия не столь сильные, общие принципы сохранились. Catel.Fody удобен, конечно, но он есть и вне Catel. Я обычно использую Fody.PropertyChanged (в связке с Caliburn.Micro например), отдельная библиотека специально для автоматической нотификации об изменении значений свойств.
@user-yl1tp5ty2s
@user-yl1tp5ty2s 8 жыл бұрын
Игорь, добрый день. Игорь, может у Вас есть простенький пример на такую тему. Главная панель, по кнопке вызывает следующую , в которой в зависимости от условия открываются N форм как я понимаю вывод производится через ListBox. Но как туда подсунуть форму? Если есть помогите пожалуйста. логику написал а визуальную часть доделать не получается. Сделал по простому 4 панели в каждой по 10 форм и пришлось каждую форму жестко прописать ((( жест ((
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Александр Ланин доброго времени, пока в голове картинка не очень сложилась (не понятно, что есть форма). Пользователь видит окно программы, нажал кнопку, содержимое окна меняется, появляется прокручиваемая область из различных контролов, ну например вопросы с вариантами ответа, только тут мы бы обошлись повторением одного и того же набора контролов (подставляя разный текст), а в Вашей задаче контролы разные. Все верно? Получается, первая страница - это один UserControl, вторая страница - второй. Главное окно содержит ContentControl, который отображает их по очереди. На втором UserControl, покуда нужно отображать несколько вложенных элементов, нужен какой-либо списочный контейнер, пусть ListBox. Пишется DataTemplate, содержащий ContentControl с ViewModelToView конвертером, самому списку задается этот DataTemplate через ItemTemplate, и отдается коллекция ViewModel-ей того, то надо отобразить через ItemSource. Подходит такой вариант?
@user-yl1tp5ty2s
@user-yl1tp5ty2s 8 жыл бұрын
+Igor Zimaev (TimeCoder) Спасибо, в целом все так. Попробую сделать. Может у Вас есть какой либо пример. Прицепил бы одну из форм для образца но не знаю как((
@dimitrishat8659
@dimitrishat8659 8 жыл бұрын
а где можно почитать документацию по Catel ? я бы хотел написать с помощью Catel пару простеньких приложений, но боюсь, что по ходу будут еще вопросы, не раскрытые в видео
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Dimitri Shatovkin с документацией у Catel все хорошо: catelproject.atlassian.net/wiki/display/CTL/Catel+documentation+Home Но честно, я бы вам посоветовал попробовать и другие MVVM-фреймворки. Понятно, что в Catel есть не только MVVM, а в других иногда нет чего-то очень удобного, что как раз есть в Catel. Поэтому, надо попробовать хотябы 2-3 самых известных.. Возможно, что в разных проектах вы захотите использовать разные фреймворки. Я в настоящий момент вместо Catel использую связку Caliburn.Micro + MAhApps + Fody.PropertyChanged - просто отличный получается код! Постараюсь об этом снять урок.
@dimitrishat8659
@dimitrishat8659 8 жыл бұрын
+Igor Zimaev (TimeCoder) Игорь спасибо за быстрый ответ ! да, мне похоже так придется и делать )))
@dimitrishat8659
@dimitrishat8659 8 жыл бұрын
+Igor Zimaev (TimeCoder) Игорь, я пытался сделать переход на другю страницу, используя пример от Catel на их странице, который я вывожу по нажатию на кнопку "login". Но мне выдает след.ошибку ( An unhandled exception of type 'System.NullReferenceException' occurred in Catel.MVVM.d) Вот страница с которой я взял пример кода : catelproject.atlassian.net/wiki/display/CTL/NavigationService; а вот код, который должен переводить на след. страцу. ViewModel страницы называется "ChoseDBViewModel" и она указана в третьей строке в качевстве параметра. В чем тут ошибка ? var dependencyResolver = this.GetDependencyResolver(); var navigationService = dependencyResolver.Resolve(); navigationService.Navigate(); Может я должен что-то указывать во View ?
@IgorZimaev
@IgorZimaev 8 жыл бұрын
+Dimitri Shatovkin Не видя остального кода сложно сказать, можешь выложить ? GitHub например
@dimitrishat8659
@dimitrishat8659 8 жыл бұрын
+Igor Zimaev (TimeCoder) там в коде еще ни чего такого нет. Класс создал Catel и наследуется от ViewModelBase, я хотел узнать как осущевствляется переход от одного окна к другому
@user-py4lz4rm1j
@user-py4lz4rm1j 9 жыл бұрын
Разве не логично было создавать коллекцию книжек в модели и потом ее пробрасывать во VM (в частности в MainViewModel). Отсюда у меня появился вопрос. Чтобы использовать атрибут [ViewModelToModel(string)], нужно сначала объявить модель посредством атрибута [Model]. Либо можно просто объявить проперти public ObservableCollection Books {...} в MainViewModel (без атрибутов). Какой способ предпочтительнее и в чем разница? И если использовать второй вариант, свяжется ли такая же проперти из модели (коолекция книг) с коллекцией из MainViewModel? Спасибо.
@IgorZimaev
@IgorZimaev 9 жыл бұрын
Борис Илларионов Можно и второе, только придется руками копировать данные из коллекции внутри Model в коллекцию внутри ViewModel, а после работы - обратно, измененные. Это все хорошо тут расписано: catelproject.atlassian.net/wiki/display/CTL/Creating+a+view+model+with+a+model+and+mappingsТ.е. первый способ лучше, они не зря его придумали. Но повторяюсь, все зависит от задачи. В простом случае, можно сделать биндинг прямо на поля модели, без всяких атрибутов (он же может быть вложенным): {Binding SomeFieldInVM.SomeFieldInThisObject}А в сложном случае все это теряет свой смысл, т.к. придется реализовывать иную схему. Если объектов пара сотен или тысяч - не так уж важно, как их вывести, работать будет. А если их миллиард? Очевидно, что просто загрузить все в коллекцию нельзя, нужно делать paging, т.е. запрашивать по кусочкам, и подгружать по мере скрола.
@user-py4lz4rm1j
@user-py4lz4rm1j 9 жыл бұрын
Igor Zimaev А если в MainVM объявить зависимость от двух моделей? Или это нарушает какие-то принципы данного паттерна? Еще я немного не понял вот эту конструкцию: // Note that we use the type factory here because it will automatically take care of any dependencies // that the PersonViewModel will add in the future var typeFactory = this.GetTypeFactory(); var personViewModel = typeFactory.CreateInstanceWithParametersAndAutoCompletion(person); Про какие такие зависимости они говорят, которые могут быть добавлены позднее? В чем преимущество использовании фабрики в данном случае?
@IgorZimaev
@IgorZimaev 9 жыл бұрын
Борис Илларионов по моей ссылке они говорят про зависимость от двух моделей. Думаю, что иногда это вполне допустимый дизайн, так код будет проще и понятнее. Вот эту штуку - CreateInstanceWithParametersAndAutoCompletion - я никогда не использовал. Думаю, что фишка этого подхода следует из самого названия. Все зависимости создаваемой ViewModel, скорее всего, пробрасываются через DI, а именно через параметры конструктора. Если нам приходится явно создавать объект этого класса, параметры придется передавать - и это не удобно. Появилась в той ViewModel новая зависимость, например, ей нужен сервис для отображения файловых диалогов, добавили интерфейс в параметры конструктора - и вот та штука сама его подтянет, не надо ничего писать руками.
@yuriymaltsev1245
@yuriymaltsev1245 9 жыл бұрын
Здравствуйте Игорь. Начал разбираться с данным уроком, дошел до 9 минуты, но с проблемами, не сказать что совсем критичными, но тем не менее. 1. После всех подготовительных работ над проектом(загрузка из интернета, подключение библиотек) автоматически сгенерированный скрипт выдает ошибку в строке Catel.Logging.LogManager.RegisterDebugListener(); по этому поводу гуглил, нашел что ни у меня одного такая проблема, но как решить пока не понял. 2.Программа запускается на исполнение больше минуты. Может нужно 13 студию использовать, а то я в 12 все это пробовал... Вот видео в докозательство kzfaq.info/get/bejne/o7t8oNeBmdK7c2w.html
@IgorZimaev
@IgorZimaev 9 жыл бұрын
Через NuGet качаете Catel.Controls? Он еще 2 либы подтянет сам. По поводу долгого старта - странно, может машина слишком слабая. Попробуйте собрать в Release и запускать без отладки (Ctrl+F5). Если выложите исходники на GitHub (или BitBucket) я смогу проверить у себя.
@yuriymaltsev1245
@yuriymaltsev1245 9 жыл бұрын
Catel.Extensions.Controls качаю через NuGet, все как на видео. На BitBucket попытался залить проект, но так и не понял как это сделать. Поэтому архив выложил сюда www.fayloobmennik.net/4339384 ctrl+f5 срабатывает моментально, запускаю на ноутбуке i7 16GB, но правда в виртуалке, там win 8.1 3GB и нормальная кусок процессора выделен, не думаю что в этом проблема, другие проекты, например из урока по mvvm запускаются без проблем. Проделал еще один эксперемент, в другой виртуальной машине установил Visual Studio 2015 Preview опять все сеачала как в видео, создал проект, подключил библиотеки и запустил на исполнение, ждал 50 сек. тут win7 и параметры нормальные тоже выделены, единственное, и та и другая ОС 32-х разрядные.
@IgorZimaev
@IgorZimaev 9 жыл бұрын
Yuriy Maltsev Для решения проблемы достаточно закоментировать StyleHelper.CreateStyleForwardersForDefaultStyles();
@yuriymaltsev1245
@yuriymaltsev1245 9 жыл бұрын
Igor Z. Спасибо, сработало!
@yuriymaltsev1245
@yuriymaltsev1245 9 жыл бұрын
Igor Z. Я уже наверно надоел своими глупыми вопросами, но появился ещё один непонятный момент. В общем я решил не качать пример к этому видео, а создал новый проект и по данному видеоуроку попытался создать такое же приложение BooksLibrary. Почему-то, хотя понятно почему, компилятор ругается в описании RemoveCommand на сравнение (_messageService.Show("Вы действительно хотите удалить объект", "Внимание", MessageButton.YesNo, MessageImage.Warning) != MessageResult.Yes), словами: Error CS0019 Operator '!=' cannot be applied to operands of type 'Task' and 'MessageResult' WPFApplication1 MainWindowViewModel.cs 140 MessageButton, MessageImage и MessageResult подтягивается из Catel.Services. Тогда я все-таки скачал архив с вашим проектом, так вот в нем, MessageButton, MessageImage и MessageResult подтягивается из Catel.MVVM,Services. В моем проекте данное пространство имен не доступно. Начал копать и выяснил следующее, в вашем проекте: Assembly Catel.MVVM C:\Users\Администратор\Desktop\DotNet-master\DotNet-master\src\packages\Catel.MVVM.3.9.0\lib et45\Catel.MVVM.dll В моем: Assembly Catel.MVVM C:\Users\Администратор\Documents\Visual Studio 2015\Projects\WPFApplication1\packages\Catel.MVVM.4.1.0-unstable0005\lib et45\Catel.MVVM.dll Видимо проблема в разных версиях. Но как мне корректно написать данное условие с моей библиотекой я так и не понял. И ещё один момент, не знаю может это связано с 2015 версии студии, но я такого раньше не видел. В общем например когда я пишу название функции, о которой студия не знает, она в всплывающей подсказке предлогает подключить пространство имен в котором функция описана, кликнув по названию, пространство имен подключается, но не как обычно в самом верху модуля: --- using Catel.MVVM; namespace BooksLibrary.ViewModels { --- а внутри namespace --- namespace BooksLibrary.ViewModels { using Catel.MVVM; --- Вот мне не совсем понятно в чем разница и вообще есть ли она?
Несколько трюков в C#
45:12
Дмитрий Нестерук
Рет қаралды 18 М.
Heartwarming: Stranger Saves Puppy from Hot Car #shorts
00:22
Fabiosa Best Lifehacks
Рет қаралды 13 МЛН
Получилось у Вики?😂 #хабибка
00:14
ХАБИБ
Рет қаралды 6 МЛН
Василиса наняла личного массажиста 😂 #shorts
00:22
Денис Кукояка
Рет қаралды 10 МЛН
Python va Djangoda Hackogi Platformasini yozishda davom etamiz [Stream III]
2:50:46
Программирование на C#. Работа с WPF
49:28
ДОЛЖЕН ПОЛУЧИТЬСЯ НА СЛАВУ | urbangrade анализ
14:55
Новостройки: плюсы и минусы | от Сергея Смирнова
Рет қаралды 7 М.
Уроки WPF. Паттерн MVVM
23:39
Программирование - это просто
Рет қаралды 86 М.
Полиморфизм на практике
10:42
ExtremeCode
Рет қаралды 178 М.
Heartwarming: Stranger Saves Puppy from Hot Car #shorts
00:22
Fabiosa Best Lifehacks
Рет қаралды 13 МЛН