非UIオブジェクトを取得してWPFコマンドバインディングに応答する

StackOverflow https://stackoverflow.com/questions/606115

  •  03-07-2019
  •  | 
  •  

質問

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 呼び出しを現在アクティブなアイテムにルーティングします。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top