MVVMパターンを使用しているWPFアプリがあります。ボタンをVMに接続するのは、ICommandを実装しているため、かなり簡単です。同様に機能するコンテキストメニューがあります。次のステップは、コンテキストメニューのショートカットキーを作成します。コマンドを起動するショートカットキーを取得する方法を理解する例は次のとおりです。
<MenuItem Header="Update" Command="{Binding btnUpdate}" >
<MenuItem.Icon>
<Image Source="/Images/Update.png"
Width="16"
Height="16" />
</MenuItem.Icon>
</MenuItem>
今、私はこれを追加しました:
<Window.InputBindings>
<KeyBinding Key="U"
Modifiers="Control"
Command="{Binding btnUpdate}" />
</Window.InputBindings>
ショートカットキーを同じバインディングに接続しようとしますが、これは機能しません。エラーは次のとおりです。
エラー169タイプ「KeyBinding」の「Command」プロパティに「Binding」を設定できません。 「バインディング」は、DependencyObjectのDependencyPropertyでのみ設定できます。
このイベントをコマンドに接続する方法はありませんか?これを理解することはできません。
前もって感謝します!
ビル
カスタムマークアップ拡張機能 をコマンドに「バインド」し、InputBindings
を作成しました。これは、実際のバインディングのように使用できます。
<UserControl.InputBindings>
<KeyBinding Modifiers="Control"
Key="E"
Command="{input:CommandBinding EditCommand}"/>
</UserControl.InputBindings>
このマークアップ拡張機能はプライベートリフレクションを使用するため、アプリケーションが完全信頼で実行される場合にのみ使用できることに注意してください...
別のオプションは、CommandReference
クラスを使用することです。 MVVMツールキットで入手できます here 。これはおそらくよりクリーンなアプローチですが、使用するのはもう少し複雑です。
WPF 4では、InputBinding.Command
、InputBinding.CommandParameter
およびInputBinding.CommandTarget
プロパティは依存関係プロパティであるため、通常どおりバインドできます。
次のコードを使用して、ショートカットキーをコマンドに直接バインドできます。
<Window.InputBindings>
<KeyBinding Command="{Binding Path=NameOfYourCommand}"
Key="O"
Modifiers="Control"/>
</Window.InputBindings>
ビューのXAMLコードのWindow.Resourcesの後にこれを追加します。
XAMLで行うのが理想的であることに同意しますが、完全を期すために、コードにバインディングを追加することもできます。コンストラクタで行う場合は、InitializeComponent()
の呼び出し後であることを確認してください。
InputBindings.Add(new KeyBinding(btnUpdate, new KeyGesture(Key.U, ModifierKeys.Control));
DataGridレベルでキーバインドを追加できました。このような :
Xaml:
<DataGrid
AutoGenerateColumns="False"
ItemsSource="{Binding YourCollection}"
CanUserAddRows="False"
HeadersVisibility="Column"
CanUserDeleteRows="False"
CanUserSortColumns="True"
CanUserResizeRows="False"
CanUserResizeColumns="False"
SelectedItem="{Binding YourSelectedItem}"
SelectionMode="Single"
SelectionUnit="FullRow"
>
<DataGrid.ContextMenu>
<ContextMenu>
**<MenuItem Header="Delete" InputGestureText="Del" Command="{Binding DeleteCommand}">**
</MenuItem>
</ContextMenu>
</DataGrid.ContextMenu>
**<DataGrid.InputBindings>
<KeyBinding Key="Delete" Command="{Binding DeleteCommand}" CommandParameter="Delete"/>**
</DataGrid.InputBindings>
<DataGrid.Columns>
<DataGridTextColumn Header="Column Header" Binding="{Binding YourColumn}" IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
モデルを見る:
public ICommand DeleteCommand
{
get
{
return new DelegateCommand(ExecuteCommand, CanExecute);
}
}
private void ExecuteCommand()
{
// your code to delete here.
YourCollection.Remove(YourSelectedItem);
}
private void CanExecute()
{
// logic to check if the delete command can execute.
return YourSelectedItem != null ;
}