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

Поділитися
Вставка
  • Опубліковано 17 жов 2024

КОМЕНТАРІ • 130

  • @Mr4Mike4
    @Mr4Mike4 9 років тому

    Игорь, спасибо большое за урок! У меня теперь всё прояснилось!

    • @IgorZimaev
      @IgorZimaev  9 років тому

      +Mr4Mike4 обращайся) Успехов!

  • @БорисИлларионов-ш5т

    Возник еще такой вопрос. Насколько я понимаю, коллекция ObservableCoollection не является потокобезопасной? Мы сами должны заботиться об этом или это решается на уровне фреймоврка? Что будет, если произойдет одновременное редактирование модели через UI и внутренние методы модели?

    • @IgorZimaev
      @IgorZimaev  9 років тому +1

      Борис Илларионов увы, она не потокобезопасна, т.к. синхронизация требует огромных ресурсов (впрочем, у меня из-за этого не возникало проблем). В UI далеко не всегда ведь возможно добавление/удаление элементов. Отображается список через ListView, а удаление и добавление - кнопками, на которые команды, добавление открывает модальный диалог, где юзер заполняет поля. И все операции идут через ViewModel.
      Другой вариант - сделать синхронизацию руками. Может в этом вам поможет Catel'евский аналог, класс FastObservableCollection (позволяет делать обновление коллекции пачками, что очень повышает производительность). Ну или сделать на базе потокобезопасных коллекций (начинающихся с Concurent...) наблюдаемую коллекцию, вот тут вроде что-то есть: www.codeproject.com/Articles/208361/Concurrent-Observable-Collection-Dictionary-and-So

  • @advancerkit3994
    @advancerkit3994 7 років тому

    В сети - да - очень много материалов. Но толковых практически нет. И по-моему так как вы вообще крайне мало кто умеет объяснять! (мне не попадались) Мне тоже очень понравились ваши уроки. Пока лучшее, что я видел по C#. И очень хотелось бы надеяться на хоть какое-то продолжение!
    Реально очень круто! Самая суть, самое важное и достаточно подробно и постепенно чтобы понять человеку с минимальной подготовкой.
    Просто респект!

    • @IgorZimaev
      @IgorZimaev  7 років тому

      Спасибо за отзыв! Другое дело, что, если бы я сейчас сел за уроки, то сделал бы все иначе, очень давно это было, с тех пор я успел поработать по всему миру, совершенно новый опыт. И в один урок это не уместить. Например, 5-10. А эти, существующие 3 видео, тогда удалить что ли? Жаль с одной стороны, много комментариев и просмотров. С другой - они, на фоне новых видео, будут сбивать с толку.

    • @advancerkit3994
      @advancerkit3994 7 років тому +1

      Нет, нет, на счет этого не беспокойтесь. Люди, кому интересно разберутся что смотреть и с чего начинать! Думаю можно старые и оставить, просто их в отдельный плэйлист.
      От вас любое видео было бы интересно.
      Но если хотите можете и удалить, себе на комп я их уже сохранил))) думаю как и многие)

  • @Dustmadeout
    @Dustmadeout 7 років тому

    Подскажите, пожалуйста, почему стандартная процедура создания триггера на главном окне с ивентом Loaded (т.е. ....) не вызывается при загрузке главного окна? Если поставить любой другой ивент, например MouseDoubleClick или KeyDown, то он срабатывает, а вот Loaded - нет. В MVVM Light я вешал ивент Loaded на главное окно, чтобы показать модальный диалог, как это сделать в Catel?

  • @АнтонБрайт
    @АнтонБрайт 4 роки тому

    Добрый день! Вы все время повторяете Code-Behind для View не использовать, но приложение WPF не хочет запускаться (Visual Studio 2019) и выдает ошибку без привязки Control-ов к Code-Behind для View (при этом вчера эта ошибка вылезала, я закрыл VS, открыл снова, а ошибки уже нет). Почему происходит такая нестабильная работа?

    • @IgorZimaev
      @IgorZimaev  4 роки тому

      Antonbreit Breit добрый день, не видя кода сложно что-то ответить по существу. Вообще нестабильной работы обычно не наблюдается. Попробуйте выложить пример кода на любой ресурс для code sharing.

  • @_aleXela_
    @_aleXela_ 9 років тому

    Спасибо, жду другие уроки про Catel

  • @ivanprodaiko6105
    @ivanprodaiko6105 7 років тому +1

    Подскажите, делал по вашему примеру свой проект,к примеру во View у меня есть еще одна папка Header в которой лежит вьюшка, в ViewModel также создаю папку Header в которую помещаю файл ViewModel, правила именования соблюдаю, но когда нажимаю на кнопку что бы отобразить это представление ничего не происходит, как будто ViewModel ничего не знает о View. Без вложенности папок все работает прекрасно, подскажите в чем может быть проблема, что я делаю не так?

    • @IgorZimaev
      @IgorZimaev  7 років тому +2

      Если я правильно понял, ViedModel не подключается ко View, если они лежат в разных папках. Вы же во View не указываете явно, какая ViewModel ей соответствует, поэтому Catel сам ищет по совпадению имен, ****View - он ищет ****ViewModel. Не в папке, а в том же namespace, для классов, если говорить о видимости, нет файлов, папок, дисков и пр. - есть только пространства имен. Но когда в проекте вы заводите папки, в них - папки, в них - файлы -в этих файлах namespace будет все эти папки включать в себя. И View с ViewModel окажутся в разных пространствах имен. Поэтому, надо явно задать связь. С Catel давно не работал, надо читать документацию, там вроде 3-4 способа было это сделать, самый простой и в лоб - задать ViewModel внутри View явно, в DataContext. Потом можно переделать.

    • @ivanprodaiko6105
      @ivanprodaiko6105 7 років тому

      спасибо, совет пригодился, понял принцип работы)

  • @paveldavidouski
    @paveldavidouski 9 років тому

    Привет. После просмотра урока возникло сразу несколько вопросов, на которые пока не получилось найти ответов:
    1)аналогично примеру в уроке, модно ли сделать так, чтобы сразу вывелся лист слайдов(слайды друг за другом) без регистрации еще одной модели и дополнительного биндинга?
    2)если представить, что кнопка из примера, которая меняет слайды, находилась на отдельной view, то тогда как можно было бы организовать ее работу, чтобы сохранить прежний функционал?

  • @ivandurakov4030
    @ivandurakov4030 9 років тому +2

    Отлично! Спасибо! Ждём новых уроков. Пожелания: система докирующихся окон типа UI Visual Studio и управление мышью во ViewPort3D объектов типа modelvisual3d и uielement3d.
    Первый человеческий курс по MVVM и достойному фреймворку. Как это не вопит армия идолопоклонников того неуправляемого монстра MVVM, который задуман с ViewModel - простым объектом с INotifyPropertyChanged. Помню меня чуть не сожрали, когда отстаивал использование зависимых свойств для естественного байндинга. Как же, ViewModel тогда уже элемент UI по их мнению становился...

  • @konstantinbutakov7423
    @konstantinbutakov7423 7 років тому +1

    Вопрос не по видео, ещ пользуетесь WPF и Caliburn или уже что-то другое?

    • @IgorZimaev
      @IgorZimaev  7 років тому

      Для desktop-проектов лучше WPF пока ничего не придумали, а из фреймворков - да, как на Caliburn.Micro остановился, так и использую, много полезных фич в нем. Часто в связке с MahApps.Metro + AutoFac + AutoMapper.

  • @koshkapes
    @koshkapes 6 років тому

    Представим ситуацию. В моем окне приложения есть TextBox содержимое которого двусторонне забиндено на некоторый источник и для этой привязки установлено UpdateSourceTrigger=Explicit. И я хочу чтобы источник этой привязки обновлялся по нажатию кнопки. Я это, по привычке, сделал бы в обработчике события Click для кнопки, вызвал бы UpdateSource() для вышеупомянутого TextBox. Но после просмотренного я в сомнениях. Как это правильно сделать с точки зрения MVVM?

  • @s_kuzmich
    @s_kuzmich 8 років тому +6

    Ролик нужно было назвать "Знакомство с Catel", а не "Полноценная MVVM архитектура" ) все связи должны идти исключительно в одном направлении сверху вниз: View > ViewModel > Model > (DataAccessLayer\DataProvider) > Data
    msdn.microsoft.com/en-us/library/hh848246.aspx
    модель не должна знать о существовании ViewModel, ей даже не обязательно знать о существовании WPF
    для этого есть ивенты, если вдруг внезапно необходимо ;)

    • @AlexCSharp
      @AlexCSharp 6 років тому +2

      Слушай, не знаешь какие нибудь нормальные самоучители или видеоуроки по MVVM в WPF без всяких кателей и прочего? Тонны говна в интернете и почти ничего толкового. Надо задание выполнить чтоб на работу попасть, а я в MVVM вообще ничего не понимаю.

    • @sledleo
      @sledleo 5 років тому +1

      Можно писать под свои задачи по-разному, можно и View делать не знающей о ViewModel.
      А можно их всех делать независимыми, только потом добавляя промежуточный слой для привязки

  • @AlgPortfolio
    @AlgPortfolio 7 років тому

    Здравствуйте! У меня не получилось установить catel templates через online -> c# -> WPF. Templates для Кателя просто не было найдено. У меня стоит VS 2017. Вручную скачала отсюда catelproject.com/downloads/general-files/ Но не оставляет ощущение что это возможно устаревшие файлы. Подскажите пожалуйста, правильно ли я сделала и почему не получилось установить templates к у Вас?

    • @KrissKrossCool
      @KrissKrossCool 7 років тому

      Добрый день! Попробуйте от сюда github.com/Catel/Catel/issues/1022 скачать. И в ручную скопировать файлы %USERPROFILE%\Documents\Visual Studio 2017\Templates\. У меня после этого появились все шаблоны в VS2017

  • @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

  • @pavelksenofan6622
    @pavelksenofan6622 8 років тому +20

    зря забросили уроки. У Вас хорошо получается объяснять довольно сложный материал.

    • @IgorZimaev
      @IgorZimaev  8 років тому +10

      +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

  • @МаксимАкимов-в4ж
    @МаксимАкимов-в4ж 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

  • @dennisinfobox
    @dennisinfobox 7 років тому

    У меня вопрос как, с точки зрения не нарушения MVVM архитектуры, отображать на UI изменения в модели если они происходят в другом потоке. Т.е какой как правильно протянуть эти изменения от Модели к ВьюМоделе и от нее ко Вью? Например у нас в контент контроле информация о текущей температуре, а изменения температуры определяется внешним сервисом который в бакграунд потоке меняет нашу модель.

    • @IgorZimaev
      @IgorZimaev  7 років тому +1

      Самое простое: это событие в модели, на которое подписывается вьюмодель. Когда оно сработало (данные обновились), можно обновить поля во вьюмодели, и они отобразятся во view. Если не заработает, и буде ругаться, что нельзя менять UI из другого потока, то поможет Dispatcher.Invoke.
      Можно посмотреть в сторону reactive ui.

  • @Anaflion
    @Anaflion 6 років тому

    Товарищ Игорь :) Какой сегодня вы посоветовали бы фрйемворк?

    • @IgorZimaev
      @IgorZimaev  6 років тому +1

      Сегодня я бы посоветовал web-приложение на asp.net core 2 + react )
      Но бывает конечно, что нужно именно desktop-приложение. Если к нему есть требования кроссплатформенности, тогда немного печально, я не вижу прям классного решения. C++ Qt, Electron, React Native (ныне моден). Если же Windows, то WPF MVVM - да, а фреймворк я бы взял Caliburn.Micro.

  • @_SkyDancer
    @_SkyDancer 9 років тому

    Ок, А получится ли у меня во View использовать например `mahapps.metro` окна вместо стандартных или окон с `Catel`?

    • @IgorZimaev
      @IgorZimaev  8 років тому

      +Sky Dancer У того же автора есть проект Orchestra, там Catel и MahApps.Metro интегрированы. Чтобы это сделать самому - придется попотеть, т.к. у MahApps и Catel свои классы для окон. Можно посмотреть исходники Orchestra, можно использовать Orchestra, либо вместо Catel воспользоваться Caliburn.Micro.

  • @andrewsed_uplisten2019
    @andrewsed_uplisten2019 4 роки тому +3

    Игорь куда пропал? мы типо ждём серию уроков (штук 10)

  • @БорисИлларионов-ш5т

    Что-то никак не могу понять для чего тогда нужна модель при таком подходе? Что в ней может храниться и как правильно связать с VM?

    • @IgorZimaev
      @IgorZimaev  9 років тому +3

      Борис Илларионов зависит от конкретного случая. Смотрите, 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-технологиям).

  • @radast123
    @radast123 7 років тому

    Подскажите как можно также привязать 13:46 isEnable на количество элементов?
    Привязываю объект вида List к datagrid и по кнопке листаю содержимое объекта.

    • @IgorZimaev
      @IgorZimaev  7 років тому +1

      Самое простое: использовать триггер 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 років тому +1

      Adrug А если вместо SelectedIndex использовать SelectedItem (который будет становиться null)?

    • @radast123
      @radast123 7 років тому

      Спасибо еще раз получилось. Вопросов миллион конечно еще, но думаю будет слишком нагло спрашивать еще.

    • @IgorZimaev
      @IgorZimaev  7 років тому

      Спрашивайте, отвечу по возможности.

  • @AnrelD
    @AnrelD 2 роки тому

    Актуальна ли эта информация для 2022 года?

    • @IgorZimaev
      @IgorZimaev  2 роки тому +1

      Принципы 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... Ну может действительно не тратить время на это и надеятся что в будущем вообще перейдем на новую технологию.

  • @ori-d
    @ori-d 8 років тому

    Странно, но у меня не работают ни кол бек методы, ни инициализация, просто пустое окно, если я загружаю контент через contentcontrol, В чем проблема?

    • @IgorZimaev
      @IgorZimaev  8 років тому +1

      +Mikhail Gribkov могу сказать только увидев код) Вот тут удобно выкладывать: gist.github.com

    • @ori-d
      @ori-d 8 років тому

      Oops, Нашел ошибку, нужно было из конструктора убрать UIVisualizerService =)
      Видео отличное, спасибо =)

  • @mrPahanbl4
    @mrPahanbl4 9 років тому

    Очень удобно использовать Catel.Fody для автоматического формирования свойств. Отпадает надобность использования vmprop и иже с ними))

  • @hornermotorbiker4360
    @hornermotorbiker4360 7 років тому

    Чуть по-бодрее бы. А так, круто, конечно! лайк от меня.

  • @БорисИлларионов-ш5т

    В таком случае, хотелось бы посмотреть видео на каком-нибудь примере вроде списка аккаунтов, у каждого из которых есть свой динамический статус вроде "онлайн", "отошел" и статическим логином с паролем. А также сохранением добавленных пользователем аккаунтов в БД (для простоты можно взять сериализацию в файл). Если я правильно понимаю, список аккаунтов должен лежать в модели и именно она должна реагировать на изменения статуса определенного аккаунта от абстрактного сервера и сообщать это каким-то образом VM, которая, в свою очередь через биндинг отобразит это в "таблице" на экране? Заодно, в данном примере будет интересно посмотреть на реализацию контекстного меню и вычисления ячейки в "таблице" по которой щелкнули (например для удаления текущей строки/аккаунта или его изменения). Таким образом, можно будет рассмотреть и обратный способ связи: от вью до модели. Как бы понятно, что через биндинг состояние VM изменится, но как внести изменения в модель? (сообщить, что для конкретного аккаунта нужно послать сообщение серверу о дисконнекте и удалить его из листа). Вешать ивент на изменению VM (обычный подход) или есть способ сделать это более красиво текущими технологиями?

    • @IgorZimaev
      @IgorZimaev  9 років тому

      Борис Илларионов Постараюсь, как в работе более-менее окошко времени появится.
      Да, все правильно, но насчет оповещения модели тут есть важный момент. Если на каждое изменение в UI отправлять данные на сервер (БД, либо сервер приложений) - сервер (или сеть, смотря где узкое место) ляжет от нагрузки. Изменения нужно группировать в пакеты, т.е. накапливать, а потом пачкой записывать. Почитайте про паттерн UnitOfWork.

  • @pavelvasilevich
    @pavelvasilevich 7 років тому

    Подскажите, как изменить стиль кнопок в DataWindow?

    • @IgorZimaev
      @IgorZimaev  7 років тому

      Вот тут есть подробное описание с примерами: catelproject.atlassian.net/wiki/display/CTL/Window+and+DataWindow#WindowandDataWindow-Customizingthebuttons

  • @МаксимАкимов-в4ж
    @МаксимАкимов-в4ж 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 9 років тому

    Добрый вечер. Будут ли продолжения по Catel?

    • @IgorZimaev
      @IgorZimaev  9 років тому

      +MrStreamdown Обязательно, хотя бы 2-3 урока, постараюсь до нового года найти время. А потом, скорее всего, пойдет тема web-программирования.

    • @MrStreamdown
      @MrStreamdown 9 років тому

      +Igor Zimaev (TimeCoder) А можно ещё поинтересоваться. Выбор за этот фреймворк - это был выбор компании, а вы просто хорошо его изучили? Чем не подошли другие: MVVM Light к примеру.

    • @IgorZimaev
      @IgorZimaev  9 років тому +3

      +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 9 років тому

      +Igor Zimaev (TimeCoder) Спасибо за столь развёрнутое объяснение. Есть ещё некоторые пожелания :) Может получится у вас осветить их хотя-бы парой слов:
      1) Те самые зависимые свойства. Желательно на примере сложнее чем textblock)) к примеру Listview на нескольких формах.
      2) Немного про EventTrigger
      3) Немного про связи с базами данных хотя бы чисто обзорно. К примеру в комплексе с EF.
      Это чисто пожелания.

    • @IgorZimaev
      @IgorZimaev  9 років тому

      +MrStreamdown ок, принял. Не понял только в п.1: listView на нескольких формах - в каком смысле? Одни и те же данные в нескольких окнах?

  • @МаксимАкимов-в4ж
    @МаксимАкимов-в4ж 8 років тому

    using Catel.Core;
    using Catel.MVVM;
    using System.Threading.Tasks;
    public class MainWindowViewModel : ViewModelBase
    {
    private readonly IUIVisualiserService _visualiserService;
    Вот так объявлено, и не видит тип IUIVisualiserService.

  • @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

  • @bog_roman
    @bog_roman 7 років тому +12

    рассказчик засыпает или боится микрофона?

    • @IgorZimaev
      @IgorZimaev  7 років тому +9

      Нет, выступать я не боюсь, 10 лет преподавания за спиной. Уроки записывал ночью, после работы, и говорил не громко, чтобы никого не разбудить.

  • @ДаниилЧернюк
    @ДаниилЧернюк 4 роки тому

    Здравия, товарищи
    Есть кто может на вопрос ответить по wpf?
    не могу ответ найти

    • @IgorZimaev
      @IgorZimaev  4 роки тому

      Даниил Чернюк задавайте

    • @ДаниилЧернюк
      @ДаниилЧернюк 4 роки тому

      @@IgorZimaev я хочу написать приложение, в основном меню есть поле контейнер со структурой
      есть основное окно меню и побочное для ввода значения структуры ( 2 string и 3 int)
      там текстовые блоки, ввожу значения
      Как мне из побочного окна или обратиться к полю основного окна или передать данные инфо поля?) (Нажатием кнопки на побочном окне добавить элемент с такими полями в контейнер, который является полем в основном окне, в коде С#)

    • @ДаниилЧернюк
      @ДаниилЧернюк 4 роки тому

      если сократить
      как обратиться из побочного окна к переменной в основном окне?
      this. Owner. data пишет нельзя на data
      что-то не то с областью видимости

  • @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 років тому +2

      Dem Bulson По поводу POCO vs. DependencyProp - это холиварная тема. Много материалов в сети, доводов в обе стороны. Сам по себе этот факт (аналогично Windows vs Linux, Intel vs AMD и пр.) говорит о том, что единственно правильного решения здесь нет (иначе оно бы естественным образом вытеснило бы неправильное), оба подхода имеют право на существование, важно понимать, в каком случае какой из них уместен.
      Касательно сложности видео - так это не видеокурсы же. Всего лишь 3 видео, которые я снял много лет назад для студентов, которым преподавал ООП, как сопровождение для одной из лабораторных. Т.е. я это и не позиционирую как пошаговый tutorial, от азов к вершинам. Есть, конечно, мечта сделать такое, но времени пока не хватает.

    • @bulsond
      @bulsond 8 років тому

      Igor Zimaev
      Я понял, спасибо.

    • @shmutalov
      @shmutalov 8 років тому

      По поводу переименований переменной, nameof наверное должен помочь. Пожалуйста, сделайте видео об использовании Fody. Спасибо.
      UPD: А где можно взять слайды?

  • @МаксимАкимов-в4ж
    @МаксимАкимов-в4ж 8 років тому

    Хммм (((. Catel.Core и Catel.mvvm установлены

    • @IgorZimaev
      @IgorZimaev  8 років тому

      +Максим Акимов Без кода ничего не могу сказать, может опечатка в одну букву где. Вот пример с IUIVisualizerService, который я делал для этого урока, выкачайте его и попробуйте собрать: github.com/TimeCoder/DotNet/blob/master/src/BooksLibrary/ViewModels/MainViewModel.cs

  • @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 років тому +1

      Руслан К А, вон оно что. Честно - не пробовал, не очень привлекает сама идея, если уже писать под 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.

  • @itcloudguy
    @itcloudguy 5 років тому

    Что за "Ви-Пи-Эф"? VPF что-ли? Не слыхал о такой технологии.

    • @artyombelousovig4901
      @artyombelousovig4901 4 роки тому

      Ты на Руси живёшь или хде , бусурманин?

  • @KALMAPUK
    @KALMAPUK 6 років тому

    досмотрел до 15 минуты -> абсолютно бесполезное...