非UIオブジェクトを取得してWPFコマンドバインディングに応答する
質問
ViewModelクラスがあり、これは組み込みのRefreshコマンドに応答しますが、ボタンから起動されますが、CommandTargetの宣言方法がわかりません。
簡単に、私のコードは以下のとおりです
ViewModelコンストラクター、CanExecuteおよびExecutedイベントハンドラー
public ViewModel()
{
CommandBinding binding = new CommandBinding(NavigationCommands.Refresh, CommandHandler);
binding.CanExecute += new CanExecuteRoutedEventHandler(binding_CanExecute);
binding.Executed += new ExecutedRoutedEventHandler(binding_Executed);
CommandManager.RegisterClassCommandBinding(typeof(ViewModel), binding);
}
void binding_Executed(object sender, ExecutedRoutedEventArgs e)
{
Debug.Print("Refreshing...");
}
void binding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
マークアップは-
<Button Command="Refresh">refresh</Button>
今、このボタンのCommandTargetを {Binding Source = {StaticResource ViewModel}}
に設定しようとしましたが、「CommandTarget」属性の値を変換できませんというランタイムが表示されますタイプ「System.Windows.IInputElement」のオブジェクトへ。
私はコマンドが初めてなので、ここではあらゆる種類の間違いを犯している可能性があります。 Anyhelpいただければ幸いです。
解決
RoutedCommand
とMVVMは混在しません。 RoutedCommand
はビジュアルツリーに関連付けられており、WPFの CommandBindings
コレクションに依存しています。 MVVMパターンで動作する独自の ICommand
クラスを実装する必要があります。初心者向けの Prismの実装をご覧ください。
私自身のMVVMプロジェクトには、いくつかのコマンド実装があります:
-
DelegateCommand
。呼び出しは、デリゲートを提供して、コマンドを実行できるかどうかを判断し、コマンドを実行します。 -
ActiveAwareCommand
。インターフェイス(IActiveAware
)と連携して動作し、現在アクティブなアイテムにコマンド実行を送信します。複数のアクティブ対応実装がコマンドに登録され、コマンドは自動的にCanExecute
/Execute
呼び出しを現在アクティブなアイテムにルーティングします。
所属していません StackOverflow