0

静的クラスApplicationCommandsは多くRoutedUICommandの で構成され、一部は純粋にビューベースのコマンド (元に戻す/やり直し、切り取り/コピー/貼り付け) である可能性がありますが、他のものは最終的にビュー モデルを操作する必要があります。ただし、後者のコマンドのいずれかを使用する場合、たとえばSave、コマンドをビュー モデルに伝達するクリーンな方法はありません。

<CommandBindings>
    <CommandBinding Command="Save" Executed="Save_Executed" />
</CommandBindings>
....
<MenuItem Command="Save" />

これにより、MVP パターンで使用されるように分離コード クラスでイベント ハンドラーが呼び出されますが、イベントハンドラーSave_Executedでこの醜い行を使用する場合を除き、コマンドを MVVM のビュー モデルに移動することはできません。Save_Executed:

((ViewModel1)this.DataContext).Save();

RelayCommandこれは、ビュー モデルで直接定義された sなどの他のコマンドとも完全に矛盾しています。これらすべての不都合のために、ApplicationCommands は MVVM ではなく MVP のみを念頭に置いて設計されたという印象を受けました。

ビューモデルに伝達する必要があるコマンドはまったく使用可能ですか?

4

2 に答える 2

0

私があなたの質問を正しく理解していれば、あなたがこのようにそれに近づくならば、あなたはあなたが求めていることをすることができると思います。

あなたのViewModel

// Call this from your ctor
 private void InitializeCommandBindings()
    {
        this.CommandBindings = new CommandBindingCollection(new[]
            {                   
        new CommandBinding(
                    ApplicationCommands.Save,
                    new ExecutedRoutedEventHandler(YourEventHandler),
                    new CanExecuteRoutedEventHandler((sender, e) => e.CanExecute = Your Logic...))
});
}

あなたの見解

<Button Command="{x:Static ApplicationCommands.Save}"/>
于 2012-10-10T16:02:35.737 に答える
0

ビューにバインディングを追加する必要があります

this.CommandBindings.AddRange(((MainViewModel)this.DataContext).CommandBindings);
于 2014-01-03T09:59:35.853 に答える