powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как правильно дополнить комманду Application.Delete, сохранив её базовое выполнение?
7 сообщений из 7, страница 1 из 1
Как правильно дополнить комманду Application.Delete, сохранив её базовое выполнение?
    #39460092
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть базовая ViewModel, в которой хочу переопределить комманду Application.Delete, добавив в неё что-то вроде запроса "Удалить запись"?, и при положительном ответе вызвать стандартный обработчик комманды.
Конечно можно обработать евент в датагриде, типа так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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 вызвать её базовое выполнение. Может кто знает?
...
Рейтинг: 0 / 0
Как правильно дополнить комманду Application.Delete, сохранив её базовое выполнение?
    #39460119
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene7,
Вы можете унаследовать свой DataGrid, туда забить обработчик DG_PreviewKeyDown и использовать его в куче окон- без копипастов.
...
Рейтинг: 0 / 0
Как правильно дополнить комманду Application.Delete, сохранив её базовое выполнение?
    #39460171
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думал об этом. Там было пару нюансов. Первый - обработать надо не только нажатие клавиши. Так-же удаление через меню(вызываемое по пкм), это отдельное событие. А если потом добавиться кнопка отдельная, или в главном меню опция - и тут не забыть. Да и viewmodel'ей с гридами уже много, везде надо внести изменения.
Подумал что через комманду проще будет, и ей не важно каким именно источником она вызвана. И теперь интересно, возможно ли вообще так сделать.
...
Рейтинг: 0 / 0
Как правильно дополнить комманду Application.Delete, сохранив её базовое выполнение?
    #39460191
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проще всего - создать отдельную команду, биндинг для неё, и засунуть всё это в грид:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
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);
  }
}


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
<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>


Нюанс: если кто в кнопку засунет обычную ApplicationCommands.Delete, то по нажатию кнопки будет всё то же обычное молчаливое удаление строк.
...
Рейтинг: 0 / 0
Как правильно дополнить комманду Application.Delete, сохранив её базовое выполнение?
    #39460356
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
маршрутизируемые команды, это наше всё :) поддерживаю Веру Павловну, хотя сам делаю малость по другому :)
...
Рейтинг: 0 / 0
Как правильно дополнить комманду Application.Delete, сохранив её базовое выполнение?
    #39461254
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем решил пойти по пути наследования DataGrid. Спасибо большое всем за помощь!
...
Рейтинг: 0 / 0
Как правильно дополнить комманду Application.Delete, сохранив её базовое выполнение?
    #39461267
Eugene7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решение Веры Павловны действительно классное, но на выходных понял что всё равно датагрид придется расширять, почему бы там и удаление строки не расширить.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как правильно дополнить комманду Application.Delete, сохранив её базовое выполнение?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]