通过键绑定从Datagrid传递命令参数

时间:2011-11-21 14:10:35

标签: wpf xaml key-bindings commandparameter

我有一个特定于wpf的问题。我正在尝试从Datagrid中删除一行,方法是定义一个Keybinding,它将Datagrid的选定Row作为CommandParameter传递给Command。

这是我的Keybinding:

<UserControl.Resources >
    <Commands:CommandReference x:Key="deleteKey" Command="{Binding DeleteSelectedCommand}"/>
</UserControl.Resources>

<UserControl.InputBindings>
    <KeyBinding Key="D" Modifiers="Control" Command="{StaticResource deleteKey}"/>
</UserControl.InputBindings>

我知道这基本上有效,因为我可以调试到DeleteSelectedCommand。但是有一个异常,因为DeleteSelectedCommand会将Datagrid的一行预先删除为Call Parameter。

如何通过Keybinding传递SelectedRow?

我希望只在XAML中执行此操作,如果可能的话,不要更改Code Behind。

3 个答案:

答案 0 :(得分:11)

如果您的DataGrid有一个名称,您可以尝试以这种方式定位:

<KeyBinding Key="D" Modifiers="Control" Command="{StaticResource deleteKey}"
            CommandParameter="{Binding SelectedItem, ElementName=myDataGrid}"/>

(注意:CommandParameter只能在.NET 4中绑定(可能是以下版本),因为它已被更改为依赖项属性)

答案 1 :(得分:2)

不是尝试使用命令参数,而是创建一个属性来存储选定的行:

private Model row;

 public Model Row
     {
         get { return row; }
         set
         {
             if (row != value)
             {
                 row = value;
                 base.RaisePropertyChanged("Row");
             }
         }
     }

其中Model是网格显示的对象的类。 在datagrid上添加selectedItem属性以使用属性:

<DataGrid SelectedItem="{Binding Row, UpdateSourceTrigger=PropertyChanged}"/> 

然后让你的命令通过该行传递给方法:

    public ICommand DeleteSelectedCommand
     {
         get
         {
             return new RelayCommand<string>((s) => DeleteRow(Row));
         }
     }

和你的键绑定:

 <DataGrid.InputBindings>
            <KeyBinding Key="Delete" Command="{Binding DeleteSelectedCommand}" />
        </DataGrid.InputBindings>

希望有所帮助!

答案 2 :(得分:0)

在KeyBinding上有一个名为CommandParameter的属性,此处设置的任何内容都将被传递。然而,它不是依赖属性(在3.5中,对于4.0,参见H.B.的答案),正如您在命令中找到的那样,输入绑定不在继承树中,因此他们不打扰使它们成为DP。

您需要使用与绑定命令相同的解决方案。 这里有一个例子,http://www.wpfmentor.com/2009/01/how-to-add-binding-to-commandparameter.html

 <DataGrid x:Name="grid">
  <DataGrid.Resources>
    <WpfSandBox:DataResource x:Key="cp" BindingTarget="{Binding SelectedItem, ElementName=grid}" />
  </DataGrid.Resources>
  <DataGrid.InputBindings>
    <KeyBinding Key="q" Modifiers="Control" Command="{x:Static WpfSandBox:Commands.Delete}">
      <KeyBinding.CommandParameter>
        <WpfSandBox:DataResourceBinding DataResource="{StaticResource cp}"/>
      </KeyBinding.CommandParameter>
    </KeyBinding>
  </DataGrid.InputBindings>
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Value}"  />
    <DataGridTextColumn Binding="{Binding Value}"  />
  </DataGrid.Columns>
</DataGrid>