Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Асинхронные команды и обновление UI / 9 сообщений из 9, страница 1 из 1
24.08.2010, 16:52
    #36808691
JohnSparrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронные команды и обновление UI
Доброго времени суток

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

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

и все.
...
Рейтинг: 0 / 0
24.08.2010, 18:05
    #36808924
i've WPF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронные команды и обновление UI
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
24.08.2010, 18:09
    #36808931
i've WPF
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронные команды и обновление UI
В догонку. А BackgroundWorker в сад. В RX все делается гораздо проще
...
Рейтинг: 0 / 0
25.08.2010, 01:53
    #36809348
JohnSparrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Асинхронные команды и обновление UI
AlexeiK, у меня несколько другая ситуация. Мне не нужно запоминать, из какого контрола запущен код (выполнение команды), мне нужно, чтобы все контролы, привязанные к данной команде, корректно обновились после ее асинхронного выполнения.
Пример:
есть окно, в нем набор вкладок
модель главного окна - коллекция объектов Document (соответствующих вкладкам)
у модели есть свойство ActiveDocument, соответствующее документу активной в данный момент вкладки
в окне есть панель инструментов, на ней кнопка "Save", у которой Command={Binding Path=ActiveDocument.SaveCommand}. Команда асинхронная и Command.CanExecute возвращает false, если команда выполняется. В итоге после запуска кнопка становится неактивна, что правильно, но активной после асинхронного завершения SaveCommand.Execute не становится, что естественно, но плохо.

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

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

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

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

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


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