Передача параметра команды из сетки данных через привязку клавиш - PullRequest
4 голосов
/ 21 ноября 2011

У меня проблема с 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 требует, чтобы строка решетки данных удалялась как параметр вызова.

Как передать SelectedRow через связывание клавиш?

Я хочу сделать это только вXAML, если возможно, без изменения кода позади.

Ответы [ 3 ]

11 голосов
/ 21 ноября 2011

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

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

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

2 голосов
/ 22 ноября 2011

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

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>

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

0 голосов
/ 21 ноября 2011

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