TLは、DRが添付コマンド
私の問題は、私は "WizardControlを表示しているView
ためViewModel
を持っている、ある子を含むされParent-View-Model
に非同期解約コマンドを添付することが可能です「(あなたは次のビューを取得するために[次へ]をクリックすることができ、インストール・アシスタント、のような)
は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 DelegateCommand
はCancellationEventArgs
EDITによって拡張セルフメイド実装でありますユーザがログインしていたが、それは悪いユーザエクスペリエンスだった
私がコマンドを選択したのは、can-nextのロジックも必要なので、基本的にViewModelのコマンドを選択する平均的な理由です。^^ –
'ICommand'は*私をボタンに束縛します*。 ..あなたが(ビジネス)ロジックの中でそれを使うならば、 'ICommand.Execute'は' async'ではなく、そのパラメタは名前だけのオブジェクトであるため、おそらくユーザを混乱させ、柔軟性を犠牲にします。 2つの最も明白な制限。より問題になるのは、単一のuiスレッドのコンテキストを残すので、あなたがuiから離れたときに 'CanExecute' /' Execute'システム全体です。一般に、 'CanExecute'がtrueを返すとしても、あなたが' Execute'を呼び出すと、それは偽である可能性があり(その逆もあります)、意味がありません。 – Haukinger
私が 'if(Interlocked.Read(ref isExecuting)!= 0)'と 'Interlocked.Exchange(ref isExecuting、1);'を実装したものをスレッドセーフにするには、実行時に1に設定し、そうでなければ0に設定します、スレッドセーフな方法で。 _Imommand screamsは私をボタンにバインドします_:基本的には私が望むものです。私はボタンをコマンドにバインドしたい、私のボタンは '' ParentView''の中にあり、別の '' ViewModel''がそれを担当します。 セキュリティ上の理由(パスワードボックスの問題)のためのログインコマンドである1つのコマンドに対してのみパラメータが必要です –