マルチヘッダDataGridメモ-四(内部実装)

・Contentプロパティの変更用メソッドをオーバーライドする。
 Contentプロパティ(中身)の変更と共に処理を実装します。

/// <summary>対象となるDataGridオブジェクト</summary>
private DataGrid targetDataGrid_;

/// <summary>
/// 中身(Content)が変更された時に発生するイベント用のメソッド
/// </summary>
/// <param name="oldContent">旧コンテンツ</param>
/// <param name="newContent">新コンテンツ</param>
protected override void OnContentChanged(object oldContent, object newContent) {
base.OnContentChanged(oldContent, newContent);

if (this.targetDataGrid_ != null) {
this.ClearBindings();

///HACK:ここで登録したイベントハンドラを削除します

this.targetDataGrid_ = null;
}

if (newContent != null) {
this.targetDataGrid_ = newContent as DataGrid;

if (this.targetDataGrid_ != null) {

if (!this.targetDataGrid_.IsLoaded) {
this.targetDataGrid_.Loaded +=
new RoutedEventHandler(TargetDataGrid_Loaded);
} else {
this.TargetDataGrid_Loaded(this.targetDataGrid_,
new RoutedEventArgs());
}
}
}

return;
}

・DataGridのLoadに合わせて、処理を実装する。

/// <summary>
/// 対象となるDataGridのLoadedイベントハンドラ
/// </summary>
/// <param name="sender">イベント発生元(DataGrid)</param>
/// <param name="e">イベントデータ</param>
private void TargetDataGrid_Loaded(object sender, RoutedEventArgs e) {

var dataGrid = sender as DataGrid;
dataGrid.Loaded -= new RoutedEventHandler(TargetDataGrid_Loaded);
//各イベントにハンドラを登録します。
//サイズ変更イベント(SizeChanged)
//列表示インデックス変更イベント(ColumnDisplayIndexChanged)

//セル用パネルの水平方向オフセット
//主に、DataGridRowHeaderの幅になります。
//DataGrid側のプロパティとバインディングして、連動させます。
//CellsPanelHorizontalOffset
//NonFrozenColumnsViewportHorizontalOffset
//Background
//BorderBrush

//境界線幅の変更を監視します。

if (dataGrid.Template != null) {
//DataGrid内のスクロールビューワを探します。
//スクロールバー(垂直方向)の可視性(Visibility)と連動させます。
//スクロールの幅ともバインディングさせます。
//DataGridヘッダが使用しているボーダー(Border)のクラスタイプを確保します。
}

if (this.Template != null) {

var counter = CommonClosure.CountUp(0);

if (dataGrid.FrozenColumnCount > 0) {
//固定列有り
//→固定列側のマルチヘッダを構築します。
}

//可変列側のマルチヘッダを構築します。
}

return;
}

・サイズ変更イベント
 DataGridのサイズが変更されるので、マルチヘッダの各幅も再計算します。
・列表示インデックス変更イベント
 DataGridの列が入れ替わったという事なので、これも再計算を実行します。
・マルチヘッダの構築
 列の数だけ、ColumnDefinitionを用意する。
 マルチヘッダの一番の外枠をBorderとして、Borderを追加していく。
 Headerの内容が同じかどうかを検証し、ColumnSpanの値を決めて、 Borderに追加していく。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m