Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Как организовать кнопочки "Do" & "Cancel"?  [new]
SlavaTrim
Member

Откуда:
Сообщений: 6
Здравствуйте, помогите пожалуйста!

Имею две команды во ViewModel (это библиотека, хотелось, чтобы работало везде, не только в (U)WPF):
- Do - запускает асинхронную команду;
- Cancel - отменяет предыдущую.
Работают отлично, но нужно, что бы привязанные кнопки были: Do - не активна во время выполнения, активна в противном случае, а Cancel зеркальна Do.
Что только не пробовал - получаю весь спектр ошибок: от "Вызывающий поток не может получить доступ" до просто неизменного состояния.

Спасибо
20 окт 21, 10:51    [22385746]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать кнопочки "Do" & "Cancel"?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4450
SlavaTrim
Здравствуйте, помогите пожалуйста!

Имею две команды во ViewModel (это библиотека, хотелось, чтобы работало везде, не только в (U)WPF):
- Do - запускает асинхронную команду;
- Cancel - отменяет предыдущую.
Работают отлично, но нужно, что бы привязанные кнопки были: Do - не активна во время выполнения, активна в противном случае, а Cancel зеркальна Do.
Что только не пробовал - получаю весь спектр ошибок: от "Вызывающий поток не может получить доступ" до просто неизменного состояния.

Спасибо


1. "что бы" - вы уверены, что в вашей фразе так должно быть написано?
2. https://www.sql.ru/forum/wpf-silverlight
20 окт 21, 11:19    [22385757]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать кнопочки "Do" & "Cancel"?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4283
меня состояние кнопок до запуска асинхронной операции и после её завершения\отмены, не?
20 окт 21, 11:36    [22385765]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать кнопочки "Do" & "Cancel"?  [new]
SlavaTrim
Member

Откуда:
Сообщений: 6
Ролг Хупин
2. https://www.sql.ru/forum/wpf-silverlight
AvaloniaUI там же?
20 окт 21, 11:56    [22385782]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать кнопочки "Do" & "Cancel"?  [new]
SlavaTrim
Member

Откуда:
Сообщений: 6
Roman Mejtes
меня состояние кнопок до запуска асинхронной операции и после её завершения\отмены, не?
Была куча вариантов, только все плохие...
На Do можно нажимать сколько угодно, лишь бы не команда не была вызвана...
20 окт 21, 12:00    [22385785]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать кнопочки "Do" & "Cancel"?  [new]
vb_sub
Member

Откуда:
Сообщений: 983
SlavaTrim,
самый простой вариант
   private bool _isDoRunung = false;
    public void Do()
    {
        if (_isDoRunung) return;

        try
        {
            _isDoRunung = true;
            //твои обработки
        }
        finally
        {
            _isDoRunung = false;
        }
    }

И также у Command в WPF есть флаг CanExecute.

Сообщение было отредактировано: 20 окт 21, 12:48
20 окт 21, 12:43    [22385805]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать кнопочки "Do" & "Cancel"?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6257
https://www.google.com/search?q=wpf async icommand
первые 2 постинга в выдаче уже вполне исчерпывающе описывают решение
недоступность кнопки Cancel во время доступности кнопки Do делается элементарно стилевым триггером в xaml-разметке
20 окт 21, 12:51    [22385811]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать кнопочки "Do" & "Cancel"?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4450
SlavaTrim
Roman Mejtes
меня состояние кнопок до запуска асинхронной операции и после её завершения\отмены, не?
Была куча вариантов, только все плохие...
На Do можно нажимать сколько угодно, лишь бы не команда не была вызвана...


Вот, уже просматривается логика !

Do - команда выполняется
Do - не команда не выполняется

но терзают смутные сомнения, что утеряны еще два варианта
20 окт 21, 13:40    [22385850]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать кнопочки "Do" & "Cancel"?  [new]
SlavaTrim
Member

Откуда:
Сообщений: 6
Сон Веры Павловны
https://www.google.com/search?q=wpf async icommand
первые 2 постинга в выдаче уже вполне исчерпывающе описывают решение
недоступность кнопки Cancel во время доступности кнопки Do делается элементарно стилевым триггером в xaml-разметке
именно так всё и пытался, там к слову, неполный вариант, у меня ещё имеется - CancellationTokenSource
21 окт 21, 18:10    [22386562]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать кнопочки "Do" & "Cancel"?  [new]
SlavaTrim
Member

Откуда:
Сообщений: 6
PS
триггеры там не при делах - по идеи сам должен следить за can execute
21 окт 21, 18:22    [22386569]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать кнопочки "Do" & "Cancel"?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6257
SlavaTrim
именно так всё и пытался, там к слову, неполный вариант, у меня ещё имеется - CancellationTokenSource

И? Вы хотите, чтобы аудитория угадала, что у вас не получилось, не видя вашего кода?

SlavaTrim
PS
триггеры там не при делах - по идеи сам должен следить за can execute

За CanExecute следит тот ICommandSource, к которому привязана команда. Сама команда не следит ни за чем, и понятия не имеет, к чему она привязана. У вас что, требуемая асинхронная команда привязана и к Do, и к Cancel?
22 окт 21, 06:53    [22386740]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать кнопочки "Do" & "Cancel"?  [new]
SlavaTrim
Member

Откуда:
Сообщений: 6
вроде справился, но
<Button IsEnabled="{Binding CanDo}"
        Command="{Binding AsyncTest}"/>
<Button Command="{Binding CancelTest, UpdateSourceTrigger=PropertyChanged}"/>

        public bool CanDo
        {
            get => _canDo;
            set
            {
                if (Set(ref _canDo, value)) CancelTest.RaiseCanExecuteChanged();
            }
        }
//в конструкторе:
            CancellationTokenSource cancellationTokenSource = new ();
//Асинхронная команда
            AsyncTest = new AsyncCommand(AsyncTestDo, cancellationTokenSource, errorCancelHandler: _errorCancelHandler);
//Обычная команда
            CancelTest = new Command(
                () => AsyncTest.Cancel(), 
                () => !CanDo && !cancellationTokenSource.IsCancellationRequested, 
                _errorCancelHandler);


        private async Task AsyncTestDo(CancellationToken? c)
        {
            try
            {
                CanDo = false;
		while (true)
                {
                    if (c?.IsCancellationRequested ?? false)
                    {
                        throw new OperationCanceledException("Отменили эту бодягу))))");
                    }
//тут что-то делаем
		}
            }
            finally
            {
                CanDo = true;
                AsyncTest?.ResetCancel();
            }
        }
ЧТО НЕ КАК:
1. Многа букф для простейшей вещи: CancellationSource.Cancel()
2. Кнопка "отменить" гаснет при помощи canExecute, а основная через XAML (кажется корявым)
3 Не нравится как-то этот код...

Сообщение было отредактировано: 22 окт 21, 13:12
22 окт 21, 13:12    [22386835]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать кнопочки "Do" & "Cancel"?  [new]
pation
Member

Откуда: Москва
Сообщений: 4512
SlavaTrim,

ICommand.CanExecute
2 ноя 21, 03:54    [22391229]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить