39

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「Binding」は「KeyBinding」タイプの「Command」プロパティに設定できません。「バインディング」は、DependencyObjectのDependencyPropertyにのみ設定できます。

このイベントをコマンドに接続する方法はありませんか?私はこれを理解することはできません。

前もって感謝します!

明細書

4

5 に答える 5

42

次のコードを使用して、ショートカットキーをコマンドに直接バインドできます。

<Window.InputBindings>
    <KeyBinding Command="{Binding Path=NameOfYourCommand}" 
                Key="O" 
                Modifiers="Control"/>
</Window.InputBindings>

ビューのXAMLコードのWindow.Resourcesの後にこれを追加します。

于 2012-02-19T01:23:42.840 に答える
26

コマンドに「バインド」するカスタムマークアップ拡張機能InputBindingsを作成しました。これは、実際のバインドのように使用できます。

<UserControl.InputBindings>
    <KeyBinding Modifiers="Control" 
                Key="E" 
                Command="{input:CommandBinding EditCommand}"/>
</UserControl.InputBindings>

このマークアップ拡張機能はプライベートリフレクションを使用するため、アプリケーションが完全に信頼されて実行されている場合にのみ使用できることに注意してください...

別のオプションは、CommandReferenceクラスを使用することです。これは、ここで入手できるMVVMツールキットにあります。これはおそらくよりクリーンなアプローチですが、使用するのが少し複雑です。

WPF 4では、、、およびプロパティは依存関係プロパティであるため、通常どおりにバインドできることに注意しInputBinding.CommandInputBinding.CommandParameterくださいInputBinding.CommandTarget

于 2010-03-04T21:56:33.863 に答える
9

XAMLで行うのが理想的であることに同意しますが、完全を期すために、コードにバインディングを追加することもできます。コンストラクターでそれを行う場合は、への呼び出しの後にあることを確認してくださいInitializeComponent()

InputBindings.Add(new KeyBinding(btnUpdate, new KeyGesture(Key.U, ModifierKeys.Control));
于 2010-05-25T13:43:52.527 に答える
0

WPFショートカットキーをViewModelのCommandプロパティにバインドするための代替アプローチは、WPFアプリケーションフレームワーク(WAF)プロジェクトのShortcutKeyサンプルに示されています。

于 2010-03-07T19:12:01.283 に答える
0

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 ;
}
于 2016-08-08T10:14:37.390 に答える