|
|
|
Асинхронное обновление состояния команды06.05.2024, 23:11. Показов 3906. Ответов 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 Асинхронное выполнение команды
Обновление свойств компонентов на обновление состояния родителя Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|