RunningCSharp

MS系開発者による、雑多な記事。記事は所属企業とは関係のない、個人の見解です。

WPF:DataGridで画面表示直後、シフトキー押下で複数選択を行いたい

調査に大分手間取ってしまったのでメモ。

1、画面表示時、DataGridにデータを表示、一行目を選択状態とする。 2、そのままShift+マウスボタン押下で複数選択をしたい

上記処理を実現が、思いのほか大変でした。

一度選択行をクリックした後であればShift+マウスクリックで複数選択可能ですが、 クリック前だと選択状態を変えようと、CurrentItemにSelectedItemを入れても、 DataGridRowやDataGridCellにフォーカスを当ててもうまくいきませんでした。

最終的に、下記サイトを参考にする形で解決しました。

http://www.resolvinghere.com/sm/wpf-datagrid-multiple-selection-problem.shtml

Publicではないメソッド、HandleSelectionForCellInputを実行することでクリック後に近い状態を実現できた模様です。

        private void Window_ContentRendered(object sender, EventArgs e)
        {
            DataGridRow row = test.ItemContainerGenerator.ContainerFromIndex(0) as DataGridRow;
            if (row != null)
            {
                DataGridCell cell = GetCell(test, row, 0);
                if (cell != null)
                {
                    row.Focusable = true;
                    row.IsSelected = true;
                    row.Focus();
                    //↑選択状態の変更やフォーカスのセットだけでなく、
                    //↓下記メソッドを実行する必要がある
                    var method = typeof(DataGrid).GetMethod("HandleSelectionForCellInput", BindingFlags.Instance | BindingFlags.NonPublic);
                    method.Invoke(test, new object[] { cell, false, false, false });
                }
            }
        }