Передача параметра из DataGrid с помощью клавиш


У меня есть специфическая проблема wpf. Я пытаюсь удалить строку из Datagrid, определяя привязку ключей, которая передает выбранную строку Datagrid в качестве Commandparameter команде.

Это моя связка ключей:

<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, если это возможно, без изменения кода позади.

3 4

3 ответа:

Вместо того, чтобы пытаться использовать командный параметр, создайте свойство для хранения выбранной строки в:

private Model row;

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

Где Model-класс объектов, отображаемых в вашей сетке. Добавьте свойство selectedItem в datagrid, чтобы использовать это свойство:

<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>

Надеюсь, это поможет!

Если у вашей DataGrid есть имя, вы можете попытаться настроить его следующим образом:

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

(Примечание: CommandParameter привязывается только в .NET 4 (и, предположительно, в следующих версиях), поскольку он был изменен в свойство зависимостей)

Существует свойство, называемое CommandParameter при привязке ключей, все, что задано здесь, будет передано. Однако это не свойство зависимостей (в 3.5, для 4.0 см. ответ H. B.), Как вы обнаружили с помощью команды, inputbindings находятся вне дерева наследования, и поэтому они не потрудились сделать их 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>