powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Асинхронные команды и обновление UI
9 сообщений из 9, страница 1 из 1
Асинхронные команды и обновление UI
    #36808691
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток

Имеется класс команды, реализующий ICommand, внутри него инкапсулирован BackgroundWorker и реализовано асинхронное выполнение команды. Во время асинхронного выполнения вызов ICommand.CanExecute() для этой команды возвращает false, чтобы ее нельзя было вызвать повторно. После выполнения асинхронного метода система, естественно, не вызывает ICommand.CanExecute(), и нужно самостоятельно обновить состояние зависящих от команды элементов управления. Вопрос: как инициировать вызовы CanExecute для всего UI и для отдельных элементов и как это делается по уму (т.е. чтобы не все элементы обновили свое состояние, а только те, которые подключены к данной команде)?
...
Рейтинг: 0 / 0
Асинхронные команды и обновление UI
    #36808917
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JohnSparrow,

создай маршрутизатор.
который флагами отмечает, для каких контролов был уже запущен код.
то что сча ты сделал, переделай без bw и запускай этот код ,через маршрутизатор.
вставь многопоточность в маршрутизатор для одновременного запуска кода.

и все.
...
Рейтинг: 0 / 0
Асинхронные команды и обновление UI
    #36808924
i've WPF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JohnSparrow Вопрос: как инициировать вызовы CanExecute для всего UI и для отдельных элементов и как это делается по уму (т.е. чтобы не все элементы обновили свое состояние, а только те, которые подключены к данной команде)?
Для всего UI в базовом классе VM - RefreshCanExecuteCommands().
В частных случаях - через аттрибуты у свойств или методов а'la
Код: plaintext
1.
2.
3.
4.
[DependOn("IsBusy")]
public bool CanBlaBla {...}

public bool IsBusy { set { _isBusy = value; RaisePropertyChanged( () => IsBusy ); } //Обновляем все зависимые свойства и методы
...
Рейтинг: 0 / 0
Асинхронные команды и обновление UI
    #36808931
i've WPF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В догонку. А BackgroundWorker в сад. В RX все делается гораздо проще
...
Рейтинг: 0 / 0
Асинхронные команды и обновление UI
    #36809348
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiK, у меня несколько другая ситуация. Мне не нужно запоминать, из какого контрола запущен код (выполнение команды), мне нужно, чтобы все контролы, привязанные к данной команде, корректно обновились после ее асинхронного выполнения.
Пример:
есть окно, в нем набор вкладок
модель главного окна - коллекция объектов Document (соответствующих вкладкам)
у модели есть свойство ActiveDocument, соответствующее документу активной в данный момент вкладки
в окне есть панель инструментов, на ней кнопка "Save", у которой Command={Binding Path=ActiveDocument.SaveCommand}. Команда асинхронная и Command.CanExecute возвращает false, если команда выполняется. В итоге после запуска кнопка становится неактивна, что правильно, но активной после асинхронного завершения SaveCommand.Execute не становится, что естественно, но плохо.

Короче говоря, вызов CommandManager.InvalidateRequerySuggested() в нужном месте помог.

От bw, действительно, придется отказаться, есть ряд моментов.

i've WPF, по поводу обновления через атрибуты свойств. Речь идет о написании собственных атрибутов и анализе их при установке свойства, я верно понял? Т.е. в сеттере свойства я получаю перечень свойств, у которых есть атрибут ХХ с аргументом - названием данного свойства и для этих свойств генерирую NotifyPropertyChanged? За идею спасибо, пригодится, :)

И за наводку на RX тоже спасибо, первая же статья по теме очень даже интересна.
...
Рейтинг: 0 / 0
Асинхронные команды и обновление UI
    #36809541
i've WPF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JohnSparrowi've WPF, по поводу обновления через атрибуты свойств. Речь идет о написании собственных атрибутов и анализе их при установке свойства, я верно понял? Т.е. в сеттере свойства я получаю перечень свойств, у которых есть атрибут ХХ с аргументом - названием данного свойства и для этих свойств генерирую NotifyPropertyChanged? За идею спасибо, пригодится, :)

И за наводку на RX тоже спасибо, первая же статья по теме очень даже интересна.
Правильно, но только не в сеттере, а в методе, который реализует INotifyPropertyChanged.
Добавь свойство IsBusy, к нему делай привязку.
...
Рейтинг: 0 / 0
Асинхронные команды и обновление UI
    #36811605
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо за уточнение. В самом деле, очень толковая идея.
...
Рейтинг: 0 / 0
Асинхронные команды и обновление UI
    #37353355
koJIo6ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
i've WPFВ догонку. А BackgroundWorker в сад. В RX все делается гораздо проще'
что за RX?
...
Рейтинг: 0 / 0
Асинхронные команды и обновление UI
    #37353393
enigmatic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Асинхронные команды и обновление UI
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]