旧タイトル: GridView SelectCell + フォーカス/編集の一貫性のないアクション (GridView が 2 回リロードされましたか?)
Expander の Content プロパティに設定された GridView (データにバインド) を開発しています。Expander を開いたときに、3 列目の最初の要素を選択して編集できるようにします (ただし、単にフォーカスするだけでもかまいません)。Expanded にアタッチされたこのアクションにこの機能を追加しようとしたとき、グリッドは最初の項目を選択しませんでした。トラブルシューティングを行ったところ、奇妙なことに、何かが起こっていることに気付きました。Expander は ItemsCollection 内のテンプレートの一部であるため、この ItemsCollection に新しい項目を追加するたびに、画面上に Expander が作成されます (IsExpanded = false に事前設定されています)。Debug.WriteLine を Expander_Expanded イベントに設定し、DataGrid.Loaded イベントにも設定して、イベントがいつ発生したかを知らせます。これらのイベントの両方のコードを次に示します。
DataGrid.Loaded:
DataGrid dg = sender as DataGrid;
dg.Focus();
dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[2]);
dg.BeginEdit();
Expander.Expanded:
Expander expander = sender as Expander;
DataGrid dg = expander.Content as DataGrid;
dg.Focus();
dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[2]);
dg.BeginEdit();
Expander を含む項目を作成して画面に表示すると、DataGrid.Loaded イベントが発生します。エキスパンダーが初めて展開されると、Expander.Expanded イベントと DataGrid.Loaded が発生します。その後は 1 回おきに、Expander.Expanded イベントのみが発生します。
最初に、[0][2] のセルがフォーカスされ、編集モードになります。1回おきに、セルが選択/フォーカスされていません。DataGrid.Loaded イベントにコードがない場合、Expander が初めて開かれたかどうかに関係なく、Cell はフォーカスされず、編集モードにもなりません。Expander.Expanded は実際には何もしていないようですが、選択に関してはそうです。記録として、DataGrid のバインドは完全に機能し、いつ変更を加えても (Expander を初めて開くか、それ以降に開くか)、データは適切に更新されます。誰でもこれを説明できますか?
アップデート:
さらに調査した結果、GridLoaded イベントとの関係は、Keyboard.Focus との関係ほどではありません。DataGrid が初めて読み込まれると、キーボード フォーカスがセル (TextBox の形式) に移動します。ただし、その後は毎回、キーボード フォーカスは Expander 自体を開く ToggleButton に置かれたままです。ただし、両方ともフォーカス可能であっても、Keyboard.Focus(dgCell) または Keyboard.Focus(dg) を設定しようとしても、何もしないようです。DataGrid を開いたときに「Enter」ボタンを押すことで、この仮定を検証することができました。DataGrid にキーボード フォーカスがある場合、Enter キーを押すと次の行に移動します。ToggleButton にフォーカスがある場合、Expander が折りたたまれます。
前述のように、初めて Expander を開いたときは DataGrid にキーボード フォーカスがありますが、2 回目以降は常にフォーカスがボタンになります。助言がありますか?