DataGrid теряет фокус при нажатии клавиши удаления - PullRequest
4 голосов
/ 24 января 2012

Я делаю MVVM, где DataGrid привязан к ObservableCollection с помощью DeleteItemCommand, подключенной к DataGrid.InputBindings следующим образом:

  <DataGrid.InputBindings>
      <KeyBinding Key="Delete" Command="{Binding DeleteItemCommand}" />
  </DataGrid.InputBindings>

Элемент и строка удаляются, когда пользователь нажимает клавишу удаления, но сетка теряет фокус. Вы должны щелкнуть или перейти к сетке, чтобы она снова обрела фокус, прежде чем нажать «Удалить», чтобы удалить еще один ряд (довольно неприятно). Я попытался установить DataGrid.CanUserDeleteRows = "False", но это не имеет значения.

Я заменил DataGrid на ListView, и ListView сохранил фокус.

Это ошибка в DataGrid или я что-то не так делаю? Мир и любовь, мир и любовь!

Ответы [ 3 ]

3 голосов
/ 04 мая 2012

Я решил это, используя встроенную функциональность WPF DataGrid. Сетка обрабатывает удаление элементов по умолчанию, если базовая коллекция является редактируемой (если коллекция предназначена для этой цели, это не проблема, в противном случае можно добавить промежуточную коллекцию ...). Я избежал каких-либо привязок клавиш и просто настроил сетку так:
<DataGrid ItemsSource="{Binding InvoiceItems}" IsReadOnly="False" CanUserDeleteRows="True" CanUserAddRows="False">
Коллекция ItemsSource имеет тип BidningCollection <>

В моем ViewModel (мой DataContext) я добавляю обработчик для события CollectionChanged:
InvoiceItems.CollectionChanged += InvoiceItemsCollectionChanged;

И реализовать это так:

private void InvoiceItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action != NotifyCollectionChangedAction.Remove)
            return;
        foreach (var oldItem in e.OldItems)
        {
            //do any other processing necessary
        }
    }

Это потому, что у вас, вероятно, будет по крайней мере два способа удаления элемента из вашей базовой коллекции (клавиатура с клавишей Del, некоторая кнопка) и, возможно, некоторые другие вещи, о которых нужно позаботиться при удалении элемента.

0 голосов
/ 10 марта 2015

Вы уже проверяли этот ответ?

Как связать действие удаления (в WPF Datagrid) с командой или свойством в модели представления

Вам, вероятно, нужно:

  1. убедитесь, что CanUserDeleteRows = "False"
  2. убедитесь, что ключ действительно привязан к указанной команде в текстовом тексте, например:

    <DataGrid.InputBindings>
        <KeyBinding Key="Delete" Command="{Binding DataContext.DeleteEntry, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/>
    </DataGrid.InputBindings>
    

Ранее мне не удалось выполнить элемент № 2, и я написал Command = "{Binding DeleteEntry}", в то время как на самом деле я должен связываться с DataContext.DeleteEntry с помощью RelativeSource.

0 голосов
/ 29 февраля 2012

Я столкнулся с этим некоторое время назад.Почему-то это событие никогда не поднимается.Попробуйте этот подход .

Короче говоря, событие PreviewKeyDown доставит вас туда, куда вы хотите.

И в MVVM-дружественной манере:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="PreviewKeyDown">
      <i:InvokeCommandAction Command="{Binding DeleteItemCommand}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>
...