0

編集可能な列が 1 つあるデータグリッドを含む WPF アプリケーションを作成しました。ユーザーが値を入力して Return キーを押すと、フォーカスが次の行に移動します。すべてうまくいきます。

顧客から、上下のカーソル キーのサポートを追加して、グリッド内のセルが編集モードのときに下を押すと Return キーを押したのと同じ結果が得られるようにするように依頼されました。上に押すのは Return と似ていますが、選択された行が編集されたセルの下ではなく上の行になる点が異なります。

セルでキープレスイベントを探しました-喜びはありません-データグリッド自体でキーダウンイベントをキャプチャしましたが、カーソルキーを押してもこれは発生しませんでした。

誰でも解決策を提案できますか?

編集

言及する必要がありましたが、MVVM スタイルのコンテキストを使用し、ICollectionView でフィルター処理されたデータ セットにバインドしています。

4

2 に答える 2

2

DataGrid.PreviewKeyDown イベントを使用します。

<DataGrid PreviewKeyDown="DataGrid_PreviewKeyDown"

このイベントハンドラで

private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
    DataGrid grid = sender as DataGrid;
    ICollectionView view = CollectionViewSource.GetDefaultView(grid.ItemsSource);

    switch (e.Key)
    {
        case Key.Up:
            view.MoveCurrentToPrevious();
            e.Handled = true;
            break;
        case Key.Down:
            view.MoveCurrentToNext();
            e.Handled = true;
            break;
    }
}

そしてそれはうまくいくはずです。

于 2012-07-25T08:41:00.460 に答える
0

バインドされたデータコンテキストを使用しているために(私は思うに)うまくいかなかったにもかかわらず、私は彼の答えに対してLPLに+1を与えました。しかし、LPLは私を正しい方向に向けました。

最後に、バインドされたデータに対して機能する次のコードを使用しました。ユーザーはデータをフィルタリングできますが、これは引き続き機能します。また、編集モードでないときは上下が完全に機能するため、編集モードのときだけ選択範囲を移動します。

    private void OrderGrid_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        var viewModel = this.DataContext as IShopOrderingViewModel;
        var view = viewModel.FilteredOrderLines as IEditableCollectionView;
        if (view.IsEditingItem)
        {
            switch (e.Key)
            {
                case Key.Up:
                    if (OrderGrid.SelectedIndex > 0)
                    {
                        OrderGrid.SelectedIndex--;
                        e.Handled = true;
                    }
                    break;
                case Key.Down:
                    if (OrderGrid.SelectedIndex < (OrderGrid.Items.Count - 1))
                    {
                        OrderGrid.SelectedIndex++;
                        e.Handled = true;
                    }
                    break;
            }
        }
于 2012-07-25T14:35:01.777 に答える