4

我有一个 wpf 特定的问题。我试图通过定义一个键绑定,将数据网格的选定行作为命令参数传递给命令,从而从数据网格中删除一行。

这是我的键绑定:

<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 的一行作为调用参数删除。

如何通过键绑定传递 SelectedRow?

如果可能,我只想在 XAML 中执行此操作,而不更改背后的代码。

4

3 回答 3

12

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

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

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

于 2011-11-21T14:17:56.393 回答
2

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

private Model row;

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

其中 Model 是您的网格正在显示的对象的类。在数据网格上添加 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>

希望有帮助!

于 2011-11-22T09:40:47.693 回答
0

KeyBinding 上有一个叫做CommandParameter 的属性,这里设置的任何东西都会被传递。然而,它不是一个依赖属性(在 3.5 中,对于 4.0,请参见 HB 的答案),正如您在命令中发现的那样,输入绑定不在继承树中,因此它们不会费心使它们成为 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>
于 2011-11-21T14:30:28.167 回答