2016-11-16 3 views
1

TLは、DR添付コマンド

私の問題は、私は "WizardControlを表示しているViewためViewModelを持っている、ある子を含むされParent-View-Modelに非同期解約コマンドを添付することが可能です「(あなたは次のビューを取得するために[次へ]をクリックすることができ、インストール・アシスタント、のような) 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を実装しました。事前に

おかげで、
フロ

PS。 Attached Commandsは私がクリックしてページ上の「ログイン」ボタンを余分に持っていたことだった、とだけ次を行くことを許さ前
私の実装:The DelegateCommandCancellationEventArgs

EDITによって拡張セルフメイド実装でありますユーザがログインしていたが、それは悪いユーザエクスペリエンスだった

答えて

2

なぜコマンドでなければならないのですか?あなたがボタンに直接ログイン機能をバインドしたくない場合は、コマンドを提供していない、メソッドを使用します。

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

別の方法は、それを他の方法でラウンドを構築することです:ウィザードのページのコマンドをバインド次のボタン(ウィザードページでも提供されているボタンの内容とともに)に移動し、ウィザードページのコマンドでウィザードを次のページに進めます(IWizardのサービスをウィザードページに提供します)。

+0

私がコマンドを選択したのは、can-nextのロジックも必要なので、基本的にViewModelのコマンドを選択する平均的な理由です。^^ –

+0

'ICommand'は*私をボタンに束縛します*。 ..あなたが(ビジネス)ロジックの中でそれを使うならば、 'ICommand.Execute'は' async'ではなく、そのパラメタは名前だけのオブジェクトであるため、おそらくユーザを混乱させ、柔軟性を犠牲にします。 2つの最も明白な制限。より問題になるのは、単一のuiスレッドのコンテキストを残すので、あなたがuiから離れたときに 'CanExecute' /' Execute'システム全体です。一般に、 'CanExecute'がtrueを返すとしても、あなたが' Execute'を呼び出すと、それは偽である可能性があり(その逆もあります)、意味がありません。 – Haukinger

+0

私が 'if(Interlocked.Read(ref isExecuting)!= 0)'と 'Interlocked.Exchange(ref isExecuting、1);'を実装したものをスレッドセーフにするには、実行時に1に設定し、そうでなければ0に設定します、スレッドセーフな方法で。 _Imommand screamsは私をボタンにバインドします_:基本的には私が望むものです。私はボタンをコマンドにバインドしたい、私のボタンは '' ParentView''の中にあり、別の '' ViewModel''がそれを担当します。 セキュリティ上の理由(パスワードボックスの問題)のためのログインコマンドである1つのコマンドに対してのみパラメータが必要です –