|
|
|
Асинхронное обновление состояния команды06.05.2024, 23:11. Показов 3893. Ответов 65
Метки нет (Все метки)
xellan24rus, скорее всего порядок "обновления" на это влияет. Потому что не раз сталкивался немного с другой вещью: есть свойство в VM, оно же используется в качестве CanExecuted в некой команде. Но! Если привязать элемент View IsEnabled к тому свойству напрямую - все замечательно. А вот, если этот элемент ведется от этого же свойства, но от команды - он "енаблируется" только по тычку мыши по окну! Хотя все возможные дебаги показывают что это свойство давно уже в TRUE. Не стал сильно разбираться, переделал, но пока такой вот "факт" остался непонятным явлением...
Добавлено через 3 минуты Иными словами, происходит некая "серия команд", часть из которых не достигает получателей (типа застревает), но если тыкнуть окно - все приходит. Что интересно - точно с таким же проектом на таких же условиях все работает. Вообще не понял что происходит с этим, каждую запятую проверял - ну блин вообще отличий нет. Но не работает. Чудеса.
0
|
|
| 06.05.2024, 23:11 | |
|
Ответы с готовыми решениями:
65
Потоки: асинхронное обновление объектов на карте
Асинхронное обновление Partial view |
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
||
| 08.05.2024, 17:15 | ||
|
Добавлено через 2 минуты wizard41, а если сделать локальный сервер для активации и деактивации Enable? Допустим даже фокуса у окна не будет и клика. Только в реальном времени должен обновить свойство локальный сервер. Такая симуляция подойдет под ваш вопрос? Можно HttpListern сделать чтобы не заморачиваться так сильно
0
|
||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
|||
| 08.05.2024, 18:07 | |||
|
0
|
|||
|
Модератор
|
||
| 08.05.2024, 19:14 | ||
|
Для полной имитации (чтобы исключить фактор фокуса окна) можно создать 3-5 секундный таймер (System.Timers.Timer или System.Threading.Timer). Я думаю, что ошибка в чём-то ином. И при попытке воспроизведения проблемы, wizard41, вполне возможно, сам найдёт её причину.
0
|
||
|
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
|
||
| 08.05.2024, 19:23 | ||
|
Элд Хасп, тоже верно. Загвоздка в воспроизведение примера только.
0
|
||
|
|
|
| 08.05.2024, 23:16 [ТС] | |
|
Залил клавиатуру, пришлось разбирать/стирать/сушить...
![]() xellan24rus, попробовал ваш EnabledCommandAsync() - результат тот же:Кнопка что активится от Команды - не активируется. Ну и это как бы предполагается, т.к. проблема не в источнике сигнала, а в самой команде... Что-то вокруг этого крутится.
0
|
|
|
|
||||||
| 08.05.2024, 23:17 [ТС] | ||||||
0
|
||||||
|
|
||
| 08.05.2024, 23:36 [ТС] | ||
|
Поэтому Async Task полностью эмулирует ситуацию. Добавлено через 11 минут Надо попробовать какую-то другую базовую реализацию ICommand. Считаю, что неправильно работает моя текущая реализация, хотя она вполне себе "стандартная" - как у всех. Раньше этот момент "замаскировывался" тем, что все команды приходили от элементов самого окна и такая ситуация была не видна. Но как только источник команды стал "сторонним" - вылезли такие странные вещи.
0
|
||
|
Модератор
|
|||
| 08.05.2024, 23:46 | |||
|
Простые реализации для тем на форуме Добавлено через 4 минуты
0
|
|||
|
Модератор
|
|||
| 08.05.2024, 23:56 | |||
"А чтобы было!" - наверное? Добавлено через 2 минуты Вот здесь есть ссылка на более-менее нормальную реализацию асинхронных команд: Интерфейс и асинхронность Добавлено через 1 минуту А ваша реализации по сути ничего не упрощает при применении, только добавляет ещё один лишний тип. Добавлено через 2 минуты
Для UWP - не подойдёт так как есть CommandManager. Для WPF не подойдёт так как нет публичного метода поднятия CanExecuteChanged.
1
|
|||
|
|
|
| 09.05.2024, 14:42 [ТС] | |
|
Элд Хасп, в общем, потыкался с разными вариантами RelayCommand - пока ситуация остается прежней.
Почему это работало в первой версии: Рассмотрел детально первый проект, где все команды и их CanExecute отрабатывали четко - оказалось, там я контролировал флаг ComConnection, который просто отвечает за факт соединения с COM-портом, а это происходит почти моментально. Проблема появилась именно тогда, когда я стал проверять ответ от устройства - а он, само собой, приходит не сразу а с некоторой задержкой. Вот тут то все и поломалось. Почему это работает для другого устройства по USB: Тут почти точно так же, как описано выше - устройство USB либо есть, либо его нет. И если оно есть, то подключение к нему происходит мгновенно, что сразу же отражается на свойстве в команде и она работает правильно (активирует canexecute). От сюда возникает вывод, что причина кроется в "запоздалых" изменениях свойств, которые, почему-то, уже не отслеживаются CanExecute'ами команд. Это подтвердилось и в последнем экспериментальном проекте с async Task: если в ней у Task.Delay(300) задержку выставить 0, то все будет работать как надо. В других случаях, получается, что эту команду нужно каким-то образом "пнуть", чтобы она обновила у себя canexecute. Это и происходит при любой другой активности окна. Странно еще то, что такая проблема ни где не освещена прежде, как-будто с ней никто не сталкивался. Хотя, вряд-ли ситуация с изменением свойств через некоторое время после первичной активности вызывающей событие команды, и/или из других потоков является каким-то неординарным явлением... Поэтому, в настоящий момент, единственным работающим вариантом остается прямая привязка IsEnabled контрола к нужному свойству. Это работает безотказно при любых задержках и из любых потоков.
0
|
|
|
Модератор
|
|||||||
| 09.05.2024, 15:56 | |||||||
Сообщение было отмечено wizard41 как решение
РешениеОсновная часть устранения причины:
1
|
|||||||
|
|
|
| 09.05.2024, 16:18 [ТС] | |
|
Элд Хасп, ну да, ну да. Интуитивно предполагал, что нужно как-то
RaiseCanExecuteChanged() использовать, но видно к чему это привело: создание еще одного кастомного INCP вместе RelayCommand )Добавлено через 2 минуты Полагаю, что создавать зависимости нужно только для таких "трудных" команд разнесенных по времени. Для обычных оконных - использовать простой подход, как и прежде.
0
|
|
|
Модератор
|
||
| 09.05.2024, 17:03 | ||
|
VM зависит от Модели. В данном случае, ваша Модель - это Device Device1.А события Модели НУЖНО прослушивать иначе не удастся реализовать актуальное её отражение в свойствах VM. Добавлено через 4 минуты Для UWP этого не нужно. Там используется какой-то иной способ ревалидации команд. Возможно, там просто по какому-то таймеру проверяются все команды в GUI - точно не знаю.
0
|
||
|
|
||
| 09.05.2024, 17:12 [ТС] | ||
|
Проблема возникала с теми командами, canexecute которых зависел от "внешнего мира". Добавлено через 3 минуты Команда - это же View-компонент? Поэтому размещать их в VM самое место. Видел что некоторые пихают команды в Модели, что мне кажется вообще не верным. Т.к. модели могут использоваться не только в UI-приложениях.
0
|
||
|
Модератор
|
|||
| 09.05.2024, 17:16 | |||
|
Команда "сама по себе" никого не извещает. Этим занимается CommandManager. Но многие разработчики считают его использование отрицательным фактором. Поэтому есть пакеты в которых реализация команд не имеет автоматической подписки на CommandManager.RequerySuggested и в таких пакетах всегда явно надо подымать CanExecuteChanged.Не помню точно, но в каком-то "большом" есть такая реализация. Может быть в ReactiveUI. Добавлено через 1 минуту ICommand находится в сборке System.ObjectModel.dll. Эта сборка общего применения, входит даже в Standard 2.0.
0
|
|||
| 09.05.2024, 17:16 | |
|
Обновление состояний checkBox при изменении состояния соответствующего comboBox Асинхронное выполнение команды
Обновление свойств компонентов на обновление состояния родителя Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|