7

TL; DRの場合:最後の段落を参照してください。

純粋なWPFは、プレゼンテーション(コントロール、テキスト、アイコン)をビューに配置し、コマンドロジック(Execute、CanExecuteメソッド)をコードビハインドに配置することを「提案」します。ビュー()とコードビハインドの両方にロジックを配置することに加えて、練習で眉をひそめることは、 XAMLの複製CommandBindingsにはまったく役立ちません:テキスト、アイコン、大きなアイコン、ヒント、およびその他の多数のプロパティは、コマンドのたびに複製する必要があります使用されるもの:メインメニュー、コンテキストメニュー、ツールバーボタン、リボンボタンおよびその他のコントロール。

DelegateCommand最初の問題(ビューとロジックを本当に分離する)は、によって解決されるように見え、そのRelayCommandようなアプローチがあります。コマンドロジックはViewModels(またはMVVMCの場合はControllers)に移動され、コードビハインドはクリーンで、CommandBindingsビューには意味がありません。

ただし、プレゼンテーションの重複の問題に対して一般的に受け入れられている解決策を見つけることができません。コマンド表示(テキスト、アイコン)とコマンドロジックExecuteCanExecuteメソッド)を分離したい。私が見つけたすべてのコードは、プレゼンテーションをコードに入れるか(andなどのRoutedCommand追加のプロパティを使用してを作成することによって)、コードをプレゼンテーションに入れます(つまり、ハンドラーをビューとコードビハインドに入れます)。私も好きではありません。プレゼンテーションは完全にXAMLで、コードは完全にCS(ViewModelまたはController)である必要があると思います。LabelIcon

質問:ビュー(コマンドを参照するコントロールを備えたXAML)、コマンドの表示(すべてのコマンドのラベル、アイコンなど)、およびコマンドのロジック(ViewModelsまたはControllersのC#コードなどExecute)を分離する方法は?CanExecute

4

1 に答える 1

4

この問題に対する組み込みの解決策はありません。袖をまくり上げて、必要な構造を自分で作成する必要があります。

私が取り組んだ最近のプロジェクトでは、まさにこれを行いました。ICommandWPFを他の視覚的プロパティで補足する「アクション」と呼ばれる概念を作成しました。こんな感じでした...

interface IAction
{
  ICommand Command { get; }
  string DisplayText { get; }
  string ToolTipText{ get; }
  URI Icon { get; }
}

Actionアプリケーションにはインスタンスのコレクションが含まれていました。次に、これらをメニューやツールバーなどにバインドして、同じActionインスタンスをさまざまな異なるプレゼンテーションスタイルで再利用できるようにします。それはすべてかなり簡単なMVVMのものです!

于 2012-11-24T18:59:02.657 に答える