
XamDataGrid や XamTreeGrid では、幅に対してデータが少ない場合に余白列が表示されている場合があります。この余白はクリックすることで行の選択をすることができます。今回は、この操作を検知し無効にする方法(余白列のクリックを検知しイベント処理をハンドルする方法)をご紹介します。
余白列は明確に定義されていないので、はてどうしよう
実は余白列を明確にこれ!と検知するための項目がございません。しかし、余白列ではないデータのある列は ContentPresenter 内部の要素になっているため、それを利用します。
今回の場合は、クリックされた箇所が、RecordPresenter 内部であり、かつ、ContentPresenter の外である。ことをチェックすることで、余白列であると判断する方法です。
以下のサンプルコードは PreviewMouseLeftButtonDown イベント内部での処理になります。
private void xamDataGrid1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { DependencyObject? current = e.OriginalSource as DependencyObject; bool isInsideContentPresenter = false; // e.OriginalSource から RecordPresenter まで遡る while (current != null) { if (current is RecordPresenter) break; // RecordPresenter に到達したらループ終了 if (current is ContentPresenter) isInsideContentPresenter = true; // ContentPresenter 内ならフラグを立てる current = VisualTreeHelper.GetParent(current); } // RecordPresenter 内かつ ContentPresenter の外側の場合にメッセージを表示 if (current is RecordPresenter && !isInsideContentPresenter) { MessageBox.Show("RecordPresenter 内部、かつ、ContentPresenter の外側がクリックされました"); e.Handled = true; } }
こちらの処理をご参考にしていただき、実装をお試しください。