TL; DR Можно ли присоединить Cancellable команду асинхронной к Parent-View-Model
, который, содержащий ребенкаПрикрепленный Команда
Моя проблема, у меня есть ViewModel
для View
, который демонстрирует «WizardControl «(как установка-помощник, где вы можете нажать рядом, чтобы добраться до следующего вида)
Log in
Кнопка является частью Parent-View-Model
и команды для выполнения для го Кнопка должна быть комбинацией команды из Specific Page
(иначе ребенок) и MainWindow
(также родитель).
Сейчас я выполнить команду ребенка в команде родителя:
ForwardCommand = new DelegateCommand(() =>
{
CancelEventArgs cea = new CancelEventArgs();
if (NextCommand != null)
{
NextCommand.Execute(null, cea));
if (!cea.Cancel)
{
//Go to next page
}
//Else stay on that page because an error occured while the command
}
},
(nul)=> {
if (NextCommand != null)
{
return true;
}
return NextCommand.CanExecute(nul);
});
Это работает, насколько содержащая команда не имеет никакой потребности выполняются асинхронно, который в случае Login
. Потому что тогда отображается следующая страница, без входа пользователя для получения необходимых данных на следующей странице. (Загрузочная панель будет показана на первой странице при входе в систему). В случае возникновения ошибки при выполнении Child-Command
я реализовал CancelEventArgs, как вы можете видеть в коде.
Спасибо заранее,
Flo
PS. The DelegateCommand
является Self-Made Реализация продлены CancellationEventArgs
EDIT:
Моя реализация до Attached Commands
было то, что у меня был лишний «Вход» кнопку на странице, чтобы нажать, и только отпустят на следующий шаг, когда пользователь вошел в систему, но это плохой пользовательский опыт.
Причина, по которой я выбрал команду, состоит в том, что мне также нужна логика для следующего, поэтому в основном средние причины выбора команды в ViewModel ^^ –
крики ICommand * привязывают меня к кнопке *. .. если вы используете его внутри своей (бизнес-логики), вы, вероятно, запутываете пользователя, а также жертвуете гибкостью, потому что 'ICommand.Execute' не' async', а его параметр - просто объект, просто чтобы назвать два самых очевидных ограничения. Более проблематичным является вся система 'CanExecute' /' Execute', когда вы удаляетесь от ui, потому что вы оставляете контекст одной нити ui. В общем, даже если 'CanExecute' возвращает true, момент, когда вы вызываете' Execute', может быть ложным (и наоборот), что делает его бессмысленным. – Haukinger
Чтобы сделать материал потокобезопасным, я реализовал 'if (Interlocked.Read (ref isExecuting)! = 0)' и 'Interlocked.Exchange (ref isExecuting, 1);', поэтому при выполнении я устанавливаю его в 1, а в противном случае - 0 , в потоковом режиме. _ICommand крики привязывают меня к кнопке_: В основном это то, что я хочу, я хочу привязать команду к кнопке, buut моя кнопка находится внутри '' ParentView'', и за нее отвечает другая '' ViewModel''. Мне нужен параметр только для одной команды, которая является логиной для причины безопасности (PasswordBox-Problems) –