2012-01-24 8 views
4

を押したときに、私は次のようにDataGridはDeleteItemCommandとのObservableCollectionにバインドされているMVVMはDataGrid.InputBindingsにフックアップやってるフォーカスを失いましたユーザーが削除キーを押すが、グリッドがフォーカスを失ったとき。あなたは、グリッドをクリックするかタブに移動して、別の行を削除するためにDeleteキーを押す前にフォーカスを取り戻す必要があります。私はDataGrid.CanUserDeleteRows = "False"を設定しようとしましたが、違いはありません。DataGridのDeleteキーを

DataGridをListViewに置き換え、ListViewはフォーカスを保持します。

これはDataGridのバグですか?何か問題がありますか?平和と愛、平和と愛!

答えて

3

私は、WPFデータグリッドの機能に建てを使用してこれを解決しました。グリッドは、基になるコレクションが編集可能な場合(コレクションがこの目的に専念している場合は問題ありません。そうでない場合は、中間コレクションを追加できます)、デフォルトでアイテムを削除します。私は、任意のキーバインディングを回避し、ちょうどこのようなグリッドを設定します。
<DataGrid ItemsSource="{Binding InvoiceItems}" IsReadOnly="False" CanUserDeleteRows="True" CanUserAddRows="False">
のItemsSourceコレクションは私のViewModelで型BidningCollection <>

である(私のDataContext)私はて、CollectionChangedイベントのハンドラを追加します。
InvoiceItems.CollectionChanged += InvoiceItemsCollectionChanged;

そして、このようにそれを実装する:あなたはおそらくLEAで持つことになるためだ

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

あなたが元のコレクションからアイテムを削除する2つの方法(Delキー、いくつかのボタンを備えたキーボード)、そしてアイテムが削除されたときの世話をするためのいくつかの方法があります。

+0

これを試してみるにはしばらく時間をとっていましたが、それは魅力的でした。ありがとうございました!!! – KornMuffin

0

私はしばらく前にそれにぶつかった。どういうわけかこのイベントは決して起こされません。 お試しください this approach

ロングストーリーショートイベントPreviewKeyDownは、あなたの好きな場所に移動します。

とMVVMフレンドリーな方法で:

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

返信いただきありがとうございました。答えに時間を割いていただき、誠にありがとうございます。私はこれを試して、アイテムが削除されますが、DataGridの焦点を失うこの問題は、まだそれが醜い頭部を後戻りさせます。また、グリッド内の任意のキーを押すと、DeleteItemCommandが起動します。 – KornMuffin

+0

[here](http://sonyarouje.com/tag/caliburn-micro/)に記載されているように、イベントの引数を調べることで実際のキーを押すことができます。 –

0

あなたはまだこの回答を確認しましたか?

How to bind delete action (in WPF Datagrid) to a command or property in view model

おそらく行う必要があります。

  1. は必ずCanUserDeleteRows = "偽"
  2. はこのように、キーが実際にあなたのDataContextで指定されたコマンドにバインドされていることを確認します

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

以前はアイテム#2で失敗し、Command = "{Binding DeleteEntry}"と書いていましたが、実際にはRelativeSourceによってDataContext.DeleteEntryにバインドする必要がありました。

+0

あなたがリンクしている答えは、グリッドにフォーカスを置いたまま行を削除することです(私の問題でした)。 Deleteキーを押すと行が消えてしまいますが、DataGridにはフォーカスがなくなります。私は別のものの束をしようとしてしまい、この答えを使って終わった(http://stackoverflow.com/a/17127664/512365)グリッドにフォーカスを得るために、矢印キーを使って行間を移動する各削除の後、マウスでグリッドをクリックします。 – KornMuffin

関連する問題