2016-11-16 3 views
1

TL; DR Можно ли присоединить Cancellable команду асинхронной к Parent-View-Model, который, содержащий ребенкаПрикрепленный Команда

Моя проблема, у меня есть ViewModel для View, который демонстрирует «WizardControl «(как установка-помощник, где вы можете нажать рядом, чтобы добраться до следующего вида) Wizard Control

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 было то, что у меня был лишний «Вход» кнопку на странице, чтобы нажать, и только отпустят на следующий шаг, когда пользователь вошел в систему, но это плохой пользовательский опыт.

ответ

2

Почему это должна быть команда? Если вы не хотите, чтобы связать функциональные возможности входа в систему непосредственно к кнопке, не дают команду, используйте метод:

ForwardCommand = new DelegateCommand(async() => 
{ 
    if (await _currentlyShownWizardPage.DoYourStuffThatHappensWhenTheUserClicksNext()) 
     GoToNextPage(); 
}); 

Альтернативный способ заключается в создании его наоборот: связать команду странице мастера к следующей кнопке (вместе с содержимым кнопки, также предоставленной с помощью страницы мастера), и выполните команду мастера на вкладке мастера на следующую страницу (через службу IWizard, предоставленную на странице мастера).

+0

Причина, по которой я выбрал команду, состоит в том, что мне также нужна логика для следующего, поэтому в основном средние причины выбора команды в ViewModel ^^ –

+0

крики ICommand * привязывают меня к кнопке *. .. если вы используете его внутри своей (бизнес-логики), вы, вероятно, запутываете пользователя, а также жертвуете гибкостью, потому что 'ICommand.Execute' не' async', а его параметр - просто объект, просто чтобы назвать два самых очевидных ограничения. Более проблематичным является вся система 'CanExecute' /' Execute', когда вы удаляетесь от ui, потому что вы оставляете контекст одной нити ui. В общем, даже если 'CanExecute' возвращает true, момент, когда вы вызываете' Execute', может быть ложным (и наоборот), что делает его бессмысленным. – Haukinger

+0

Чтобы сделать материал потокобезопасным, я реализовал 'if (Interlocked.Read (ref isExecuting)! = 0)' и 'Interlocked.Exchange (ref isExecuting, 1);', поэтому при выполнении я устанавливаю его в 1, а в противном случае - 0 , в потоковом режиме. _ICommand крики привязывают меня к кнопке_: В основном это то, что я хочу, я хочу привязать команду к кнопке, buut моя кнопка находится внутри '' ParentView'', и за нее отвечает другая '' ViewModel''. Мне нужен параметр только для одной команды, которая является логиной для причины безопасности (PasswordBox-Problems) –

Смежные вопросы