@SitrixEug

Как правильно дополнить команду Application.Delete, сохранив её базовое выполнение?

Есть базовая ViewModel, в которой хочу переопределить комманду Application.Delete, добавив в неё что-то вроде запроса "Удалить запись"?, и при положительном ответе вызвать стандартный обработчик команды.
Конечно можно обработать евент в датагриде, типа так:
private void DG_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Delete)
            {
                if (MessageBox.Show(Putl.Properties.Resources.Messages_Delete, "", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    DG.CanUserDeleteRows = true;
                }
                else
                {
                    DG.CanUserDeleteRows = false;
                }
            }
        }

Но во первых, таких датагридов куча в куче окон, не хочется городить копипаст, во вторых по MVVM не принято делать обработчики евентов.
Пока не смог найти, как внутри обработчика команды Delete вызвать её базовое выполнение. Может кто знает?
  • Вопрос задан
  • 185 просмотров
Решения вопроса 1
@SitrixEug Автор вопроса
На текущий момент нашел решение - создать свою отдельную комманду, которая будет делать запрос на удаление, и в случае подтверждения вызывать Application.Delete
Примерно так:
public static class GridCommands
{
  public static readonly  RoutedUICommand Delete = 
    new RoutedUICommand(
      "Удалить строку",
      "DeleteRow",
      typeof (GridCommands),
      new InputGestureCollection(new[] {new KeyGesture(Key.Delete)})
    );
}

public class DeleteBinding : CommandBinding
{
  public DeleteBinding()
  {
    Command = GridCommands.Delete;
    CanExecute += DeleteBindingCanExecute;
    Executed += DeleteBindingExecuted;
  }

  static void DeleteBindingExecuted(object sender, ExecutedRoutedEventArgs e)
  {
    if (MessageBox.Show("Delete this?", "Delete this?", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
      return;
    ApplicationCommands.Delete.Execute(e.Parameter, (IInputElement)sender);
  }

  static void DeleteBindingCanExecute(object sender, CanExecuteRoutedEventArgs e)
  {
    e.CanExecute = ApplicationCommands.Delete.CanExecute(e.Parameter, (IInputElement)sender);
  }
}

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition />
  </Grid.RowDefinitions>
  <DataGrid
    Name="ItemsGrid"
    ItemsSource="{Binding Items}">
    <DataGrid.Columns>
      <DataGridTextColumn
        Binding="{Binding}"
        Header="N"
        Width="*"
        IsReadOnly="True"/>
    </DataGrid.Columns>
    <DataGrid.CommandBindings>
      <l:DeleteBinding />
    </DataGrid.CommandBindings>
  </DataGrid>
  <Button
    Grid.Row="1"
    Padding="5"
    VerticalAlignment="Center"
    HorizontalAlignment="Center"
    Content="Delete Row"
    Command="{x:Static l:GridCommands.Delete}"
    CommandTarget="{Binding ElementName=ItemsGrid}" />
</Grid>


Так-же есть вариант унаследоваться от DataGrid, и там сделать обработчики удаления строк
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Sumor
Для назначения обработчиков команде нужно указать в разделе CommangBindings контрола, в котором будет вызываться эта команда или в любом из его логических предков, обработчик событий Execute и/или обработчик CanExecute.
После этого вы привязываете команду к пункту меню, кнопке, через соответствующее свойство Command, либо указываете горячую клавишу или жест мыши через InputBindings.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы