|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
||||||||
Где лучше в MVVM реализовать дополнительную логику?25.09.2025, 19:46. Показов 8777. Ответов 118
Метки нет (Все метки)
мне почему-то кажется, что это не проблема, а как раз и задумано было, чтобы можно было переназначать свойства в зависимости от нужного (например, цвет текста при value>1000, условно говоря) - вот и вынесли это DP в отдельный класс... а за пример реализации и использования в XAML - спасибо!.. ? только в каких случаях это DP подключают обычно?.. как по мне, так Styles и Templates и даже Converters - нормальные внутренние (для объекта) свойства, дальше которых уже и придумать нечего (с практической точки зрения) чтобы захотеть подключать из-вне класса ещё и DP за гранью всего, что можно задать и в объекте...
0
|
||||||||
| 25.09.2025, 19:46 | |
|
Ответы с готовыми решениями:
118
|
|
|
|
| 30.09.2025, 09:55 | |
|
0
|
|
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
||
| 30.09.2025, 09:57 [ТС] | ||
![]() p.s. к #41 - там хороший пример - сохраните, please
0
|
||
|
|
||
| 30.09.2025, 10:12 | ||
|
0
|
||
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
||
| 30.09.2025, 10:20 [ТС] | ||
|
0
|
||
|
|
||
| 30.09.2025, 10:27 | ||
|
А клиента незачем грузить всей этой фигнёй, так как иногда клиенты работают на офисных калькуляторах, которые офис еле тянут...
0
|
||
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
||||||||
| 30.09.2025, 13:03 [ТС] | ||||||||
Binding Command в DataGridДобавлено через 5 минут Но вообще, мне ваша идея понятна и симпатична - закинуть бд на облако и тянуть с него нужное в свой UI -- скажите технически вы весь свой юзерский App выполняете на клиенте? ИЛИ какие-то Сервисы тоже располагаете на облаке, или они есть в NET.Core, или (если самописные) - то откуда их подключаете (с облака [сервера] или из Windows или local App)? или что-то с Github у вас в runtime идёт? (но там вроде нескомпилированные коммиты только хранить можно)
0
|
||||||||
|
|
||||
| 30.09.2025, 13:40 | ||||
|
0
|
||||
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
|||||||
| 30.09.2025, 13:58 [ТС] | |||||||
|
Кликните здесь для просмотра всего текста
у меня в
С++ 2 кнопки - одна становится Disabled, одна остаётся активной - для прерывания процесса ... и на них колл-бэки...
но вот Сервисы - тоже ведь в др потоке мониторят - с момента OnStart до момента OnStop... - почему сервис нельзя прикрепить к кнопке? - с момента Disabled до момента Enabled - на том и перевалидировать кнопку на её новое состояние?
0
|
|||||||
|
|
||||||||||||||
| 30.09.2025, 14:26 | ||||||||||||||
|
Добавлено через 5 минут JeyCi, Пример взаимодействия потоков VM и UI VM
0
|
||||||||||||||
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
||
| 30.09.2025, 14:46 [ТС] | ||
ради вопроса был - чтобы также просто, как у меня было... (думаю, где делать на c++ или c#)... и чем свой сервис лучше обыкновенной dll... - до сих пор думаю... ведь и то, и то надо подключатьно спасибо за пример!
0
|
||
|
|
|||
| 30.09.2025, 14:54 | |||
|
JeyCi,
1. Пишем интерфейс, в котором объявляем свойство SynchronizationContext и методы сервиса (Start, Stop и т.д.), события. 2. Запускаем сервис как transient (по вызову). 3. В нужном месте получаем его из DI по интерфейсу. 4. Присваиваем ему контекст и запускаем нужные методы. 5. Подписываемся на его события и по ним делаем что нам нужно (включаем/выключаем кнопки, элементы UI, рисуем что-то и т.д.) 6. Балдеем от того что всё работает как нужно и без лишних затрат процессорного времени. ![]() Добавлено через 3 минуты JeyCi, Оба метода не вешают контекст, так выбирать вам исходя из задачи.
0
|
|||
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
||
| 30.09.2025, 14:54 [ТС] | ||
с облаком (или GoogleDrive - если туда можно бд закинуть для скорости) ещё не связывалась, чтобы бд туда закинуть... а sqlite и на Windows работает... вы к облаку коннектились хоть раз в жизни? - есть примерчик?.. чтобы оттестить (до мыслей о полноценном сервере)
0
|
||
|
|
|
| 30.09.2025, 14:57 | |
|
0
|
|
|
Модератор
|
|||||
| 30.09.2025, 19:19 | |||||
|
На что собственно вы там хотели обратить внимание? Если судить концептуально, то там неверен сам ход рассуждения. ViewModel - это обёртка Model для удобной работы View. Поэтому рассуждения должны быть "от Модели", а нет от "вот у меня есть два окна, а в нём такие-то регионы и т.д." Добавлено через 21 минуту Типа. Описание Модели: 1) Модель находится в неавторизированном состоянии 2) Для авторизации надо вызывать метод авторизации с передачей в него таких-то данных 3) По завершению выполнения метод возвращает результат авторизации 4) Если авторизация была удачна, то состояние Модели переходит в авторизированное. Надо: 1) Для неавторизированного состояния показать Окно (или страницу, регион) авторизации, в котором вводятся данные авторизации и есть кнопка для команды авторизации 2) Если авторизация неудачно - вывести ошибку авторизации 3) Если авторизация удачна - вывести представление для авторизированного состояния. Реализация (один из вариантов) ViewModel: 1) ViewModel для авторизированного состояния 2) ViewModel для авторизации 3) Основная ViewModel для переключения между состояниями. Для этого предусматривается свойство (Current - для примера) в котором переключаются VM 4) Все VM получают в конструкторе Model Представление: 1) Одноконное многостраничное. 2) Страницы представления реализованы UserControl, которые через DataTemplate связаны с нужными ViewModel 3) Контент Окна принимает Current и больше ничего в нём нет. Можно даже не создавать XAML Окна, а использовать базовый Window. На этом всё. Никаких вплывающих команд, кликеров, внедрения команд - не нужно. Всё работает через единую Модель и внедряется только она. Добавлено через 17 минут Вместо изменения представления одной кнопки перерисовывать все окна.... По другому ни как. А... Не. Можно ещё вызывать после изменения CommandManager.InvalidateRequery(). Но это можно сделать только в View WPF и потребует от View "отлова" асинхронных изменений ViewModel (и всех вложенных объектов), а так же вызовет перевалидацию ВСЕХ команд, а не только одной нужной. Добавлено через 2 минуты Ничего экзотического Binding с ним сделать не может. Он только вернёт его значение. Нужно ли вызывать и когда вызывать перевалидацию команды или кнопки Binding не знает, это не его функция.
0
|
|||||
| 30.09.2025, 19:50 | |
|
0
|
|
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
|||
| 30.09.2025, 20:26 [ТС] | |||
|
или ещё хуже - сервер бд школы (электронные дневники учащихся) - и что, для конкретного класса после соответствующей авторизации вытягивать модель по всей школе?.. я бы сказала, что на 2 страницы, можно обратиться к 2ум разным моделям, которые каждая по-своему просто реализует какой-нибудь самописный IModels...Добавлено через 23 минуты вот а если сервис подключить - по вашему тз - с момента OnStart - пусть себе шлёт Сигналы для отлова (или messages), а VM отлавливает и в DataGrid закидывает... -- тоже примерно по схеме выше (отловили - опубликовали - отловили - опубликовали) - ну и состояние менять особо сильно не надо... до OnStop сервиса... ой, ну кнопку обездвиживать не надо... т.е. надо - только, если есть другая кнопка - отменяющая disabled первой...Всем спасибо за конструктивный разговор - (отлов асинхронных сообщений уже, наверно, для др. ветки)
0
|
|||
|
Модератор
|
||||||||||||
| 30.09.2025, 20:46 | ||||||||||||
|
Асинхронность может быть и в одном потоке. Речь же про поднятие CanExecuteChanged. Его надо подымать при любом асинхронном изменении зависимости, даже если это изменение произошло в UI потоке. Пример с двумя кнопками. В одной есть поднятие CanExecuteChanged, в другой нет. Зависимость изменяется асинхронно, но в потоке диспетчера окна.
Но если быстро кликать по любой из кнопок, то Simple-кнопка будет менять своё состояние корректно. За это отвечает CommandManager.RequerySuggested, на который подписываются команды в своём конструкторе.
0
|
||||||||||||
|
Модератор
|
||
| 30.09.2025, 20:57 | ||
|
Разделение привилегий происходит на уровне Модели. Реализации могут быть разные. Например, два таких варианта: 1) Модель "максимум", но с запретом каких-то состояний, методов и др., в зависимости от установленной в авторизации роли. Для каждой роли - своё представление. Нужное представление выбирается DataTemplateSelector. 2) Есть некая базовая Модель общая для всех ролей. Для каждой роли строится своя производная Модель. Модель авторизации, в случае успеха, возвращает нужную Модель роли. В этом случае представление для роли выбирается через его связь с типов в DataTemplate. 1-й вариант менее безопасный и требует большего внимания к распределению и управлению разрешениями. 2-й более безопасный, но не подходит для динамического управления разрешениями. Применяется там где ролей немного и у всех ролей жёстко зашитые разрешения. Типа: гость, пользователь, админ - всё.
0
|
||
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
|
||||||
| 30.09.2025, 21:02 [ТС] | ||||||
|
вот пример из Google использования CanExecuteMyCommand
off: можем внедрить всё в ту же авторизацию (мы логику особо сильно и не меняем уже 3 страницы - только Login)
0
|
||||||
|
Модератор
|
|||||||||||||
| 30.09.2025, 22:03 | |||||||||||||
|
Типа:
0
|
|||||||||||||
| 30.09.2025, 22:03 | |
|
MVVM бизнес логика и Model
Как реализовать работу нескольких окон под шаблоном MVVM? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется.
Ну как вам?
|
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания
источниках данных и элементов формы(текстовые поля и метки), опирается все
это на технологию событий и мета. . .
|
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml,
в чате форсили функторы модулей как суперфичу.
Пытаясь отдуплить концепт, наткнулся на тутор с простым примером.
А главный принцип обучения от. . .
|
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
|
|
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|