|
Модератор
|
||||||||||||||||||||||||||||||||||||
WPF команды и MVVM. Часть 1. [WPF, Элд Хасп]18.01.2019, 19:56. Показов 57502. Ответов 92
Тема из цикла Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]
Для использования и создания WPF команд в Net предусмотрен интерфейс IСommand и классы RoutedCommand и RoutedUICommand. Команда - это View компонента и ей присущи чисто View-ские свойства: можно привязать её, параметр передаваемый ей, целевой элемент; она может всплывать по дереву элементов; можно обработать её по по пути всплытия. Основная проблема применения команд в MVVM, на мой взгляд, это отсутствие встроенной поддержки привязки к методам ViewModel. Дефолтно в Net обработка команд производится аналогично обработке событий элементов в CB окна. И уже в в этом обработчике можно вызвать методы ViewModel. Но тут возникает другая проблема. Как обработчику получить ViewModel? Придётся обращаться к DataContext приводить к нужному типу, походу могут возникнуть ещё другие нюансы. Самым удобным было бы привязка команд в XAML напрямую, сразу к свойствам ViewModel. Для такой привязки в большинстве случаев создают дополнительный класс реализующий интерфейс IСommand. Почти всегда его называют RelayCommand. Реализации его могут быть разные, но они очень похожи. Одна из реализаций из темы Пример реализации WPF+MVVM приложения (с учётом замечания от Lexeq)
VievModel
И окно для PlusMinusViewModel
Изменим немного ViewModel для демонстрации обработки CommandParameter.
Окно для MultiOperatorsViewModel
Изменим ViewModel так чтобы нельзя было делить на ноль.
Использование WPF команд в MVVM для простых случаев, надеюсь, объяснил подробно и понятно. Но есть более сложные применения. Допустим, есть ListBox и в нём в шаблоне Item есть кнопка. Как к ней привязать WPF команду? Для этого надо вспомнить, что WPF команда это View компонента и одним и свойств WPF команды является её всплывание по дереву. Команду надо "поймать" во включающем ListBox контейнере и обработать. Как это сделать напишу в следующей части. Архив проекта с кодами приложен. Ещё хороший пример простой для понимания предложил Lexeq в пост #10 В пост #15 финальный вариант с учётом замечаний от HF, Lexeq, Рядовой, kolorotur. Там же архив со всеми кодами из темы. В пост #64 вариант реализации RelayCommand с исправленным (при помощи proa33 и kolorotur) методом Invalidate для работы в многопоточном приложении.
12
|
||||||||||||||||||||||||||||||||||||
| 18.01.2019, 19:56 | |
|
Ответы с готовыми решениями:
92
WPF команды и MVVM. Часть 2. Всплытие команд. Реализация команды для списка элементов [WPF, Элд Хасп] Библиотека элементов для реализации WPF MVVM Решений [WPF, Элд Хасп] Обсуждение темы "Библиотека элементов для реализации WPF MVVM Решений" [WPF, Элд Хасп] |
|
Модератор
|
|
| 11.02.2019, 18:16 [ТС] | |
|
Я же сразу написал. При обращение к методу Invalidate выдаёт ошибку из-за разных потоков.
Обновление свойств происходит в другом потоке. Это обновление вызывает метод Invalidate, но ошибка "вызывается из другого потока" Я так-то знаю, что элементы должны быть все в одном потоке. Но это же код без визуализации. Почему на нём ошибку даёт?
0
|
|
|
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
|
|||||||||||
| 11.02.2019, 18:52 | |||||||||||
|
Попробуй. Может поможет, а может и нет:
заменить строку:
0
|
|||||||||||
|
Модератор
|
|||||||
| 11.02.2019, 19:48 [ТС] | |||||||
|
Ошибку вызывает другая строка
0
|
|||||||
|
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
|
||||||
| 11.02.2019, 21:11 | ||||||
|
попробуй изменить метод Invalidate:
0
|
||||||
|
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
|
|
| 12.02.2019, 11:15 | |
|
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 12.02.2019, 11:37 | |
|
0
|
|
|
9 / 8 / 2
Регистрация: 20.02.2018
Сообщений: 94
|
|
| 12.02.2019, 11:40 | |
|
Вот объясните мне - зачем в 2019 году WPF ? Разве эта технология не устарела уже?
Вот я только начал изучать UWP. На нём можно для Windows 10 писать приложения. Скоро (пишут) Windows Core выйдет или Windows lite - там только UWP приложения будут. А WPF - это что такое вообще? Что на нём можно делать? Почему оно в разделе с UWP? Это я к чему пишу - можно ли переделать/переписать всю тему под UWP, пожалуйста? И под NET CORE, наверное (скоро планирую начать изучать). Я бы, например - с удовольствием бы попрактиковался в командах на UWP.
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||
| 12.02.2019, 11:52 | ||||||
|
Не говоря о винформах и уж тем более о WPF. Обратите внимание как UWP в названии раздела занимает скромное второе место.
0
|
||||||
|
9 / 8 / 2
Регистрация: 20.02.2018
Сообщений: 94
|
|
| 12.02.2019, 12:01 | |
|
Ой, извините... Я только предложил подумать о возможности побольше внимания уделять UWP. Только и всего....
0
|
|
|
Модератор
|
||
| 12.02.2019, 12:23 [ТС] | ||
|
Простенький пример.... Сейчас попробую упростить насколько возможно, но совсем простенько не получится.
0
|
||
|
9 / 8 / 2
Регистрация: 20.02.2018
Сообщений: 94
|
|
| 12.02.2019, 13:50 | |
|
Я всем доволен.
Просто выразил некоторые предложения по темам. Я был бы рад темам: "UWP команды и MVVM", "Тема из цикла Готовые решения, примеры и рекомендации начинающим на UWP" и т.п.
0
|
|
|
Модератор
|
||||||||||||||||||||||
| 12.02.2019, 14:04 [ТС] | ||||||||||||||||||||||
|
Model Кликните здесь для просмотра всего текста
ViewModel Кликните здесь для просмотра всего текста
Окно Кликните здесь для просмотра всего текста
kolorotur, забыл приложить библиотеку с классами RelayCommand и OnPropertyChangedClass Добавлено через 3 минуты kolorotur, если закомментить в ViewModel
0
|
||||||||||||||||||||||
|
Модератор
|
||
| 12.02.2019, 14:12 [ТС] | ||
|
Я сам начинающий и только полгода осваиваю WPF. О UWP, мало что знаю. Что-то есть общее с WPF, но есть и принципиальные отличия. Возможно когда-нибудь начну осваивать и UWP и напишу о своём опыте. P.S. Если у Вас есть хорошие примеры, опыт - напишите. Выложите тему. Я, думаю, все только рады будут.
1
|
||
|
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
|
||||||||||||
| 12.02.2019, 15:53 | ||||||||||||
Добавлено через 15 минут вариант №2 включите в вашу DLL сборки: PresentationCore.dll PresentationFramework.dll WindowsBase.dll и затем используйте вызов, как я писал ранее:
первый вариант свободен от этого.
1
|
||||||||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||
| 13.02.2019, 12:44 | |||||||
|
Только я бы это делал не в самой команде, а в месте вызова Invalidate. Вызывающему типу лучше знать в каком потоке он это делает. И да, уберите синхронизацию при привязывании/отвязывании к PropertyChanged: мало того, что она реализована коряво, так она там в принципе не нужна. Реализуйте событие как обычно:
Вызов события при привязывании — это вообще зло.
1
|
|||||||
|
Модератор
|
|||
| 13.02.2019, 13:31 [ТС] | |||
|
А как тогда лучше сделать инициирование свойств? Преследовал такую идею, что после подсоединения прослушки, посылается событие - обновить все свойства. Если делать не так, то как? В коде класса откуда подсоединяется прослушка, явно после это прописывать инициализацию всех свойств? Что посоветуете, какие более типичное решение? Тем более, мы с Вами это уже обсуждали, команды это даже не ViewModel, а View. Просто инициализация их в Xaml - заморочна. P.S. Пока времени нет, а имеющихся знаний не хватает. Но собираюсь проработать тему создания команд непосредственно в XAML/ Если получится, то концептуально будет более чистая реализация MVVM.
0
|
|||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 13.02.2019, 13:49 | |
|
0
|
|
| 13.02.2019, 13:49 | |
|
Помогаю со студенческими работами здесь
60
Создание приложения "Штатное Расписание" в паттерне MVVM [WPF, Элд Хасп] WPF конвертеры [Элд Хасп] WPF vs WinForms (для начинающих) [Элд Хасп] Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений.
. . .
|
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения
Продолжаю серию постов о дискретно-событийной модели рабочего. . .
|
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы
Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
|
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция
Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
|
|
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
|
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
|
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|