RelayCommandを使用してモデルを表示するためのコマンドのバインドに関するJoshSmithsの記事をすでに読みました。ただし、ApplicationCommands.Saveをビューモデルにバインドして、ユーザーが[保存]メニュー項目をクリックしたときにウィンドウで処理されるようにする必要があります。どうしてそれは可能ですか?
5 に答える
私が知っているサービスを使用するための最良の解決策。たとえば、次のようなICommandBindingsProvider:
public interface ICommandBindingsProvider
{
CommandBindingCollection CommandBindings { get; }
}
これはViewModelに挿入され、次のように使用されます。
public MyViewModel(ICommandBindingsProvider commandBindings)
{
commandBindings.Add(new CommandBinding(....));
}
サービスがどのように注入されるかは、使用しているMVVMフレームワークによって異なります。ほとんど(すべてではありません)は、ある種のサービスインジェクション機能をサポートしています。より具体的なコード例が必要な場合は、サービスインジェクションを実行し、これを実行するサービスを提供するOnyxを参照してください。
または、saveコマンドバインディングをビューモデルに配置してから、(擬似コード)のようにデータバインドします。
ビューモデルで:
...
public Command SaveCommand { get { return yourCodeHere; } }
...
ビューで:
<Button Command="{Binding Path=SaveCommand}" Content="Click"/>
更新:コマンドバインディングでコマンドにバインドしようとしましたが、機能しません。私が考えていたのは、コマンドへのバインドでした。
保存メニュー項目はどのように作成されていますか? どこかで ApplicationCommands.Save にバインドされている必要がありますか? 代わりに ViewModel の保存にバインドするように変更できます。
私は過去にこのアプローチをうまく使用しました:
ViewModels で CommandBindings プロパティを定義することから始めます (Views と同じ定義)。
次に、ViewModel によって実装される Command ごとに、CommandBinding を ViewModel の CommandBindings に追加します。
次に、設定すると:
view.DataSource = viewModel;
また、次のように設定します。
view.CommandBindings.AddRange(viewModel.CommandBindings);
CommandBindings プロパティのバインディングを使用して行うことができると思います (確かに思い出せません)。