スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

DataGridの列にIDをセットするんだ

何日か前の記事でも書いたけど、DataGridColumnの列を特定するのに、名前(Name)プロパティを使う事は難しい。
その列を定義したWindowクラスには、その名前を使って何らかの処理はできるけど、以下のような事はできない。

//MyDataGridは、XAML上で設定したDataGridのName
foreach (var col in this.MyDataGrid) {
if (col.Name == "XXXX") {
//列名がXXXXだったら、YYYYをする。
}
}

DataGridColumn自身は、Nameプロパティを持たない。なので、x:Nameで設定するしかないんだけど、x:Nameで設定した値をどうやっても取得できなかった。メソッドがありそうでない。届きそうで届かない。
その対処として、添付プロパティによって名前(というかID)を持たせる事にした。



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;

namespace TawamureDays {

/// <summary>
/// DataGridを拡張するためのクラス
/// </summary>
public static class DataGridExtender {

#region ColumnIdプロパティ

/// <summary>
/// 列IDを取得します。
/// </summary>
/// <param name="obj">対象オブジェクト(DataGridColumn)</param>
/// <returns>列ID</returns>
public static string GetColumnId(DependencyObject obj) {
return (string)obj.GetValue(ColumnIdProperty);
}

/// <summary>
/// 列IDを設定します。
/// </summary>
/// <param name="obj">対象オブジェクト(DataGridColumn)</param>
/// <param name="value">列ID</param>
public static void SetColumnId(DependencyObject obj, string value) {
obj.SetValue(ColumnIdProperty, value);
}

/// <summary>列ID</summary>
public static readonly DependencyProperty ColumnIdProperty =
DependencyProperty.RegisterAttached("ColumnId", typeof(string),
typeof(DataGridExtender), new UIPropertyMetadata(null));

#endregion
}
}
自分が実装する範囲でしか通用はしないけど、それで十分なのだ。
使い方は、↓な感じ

<DataGrid AutoGenerateColumns="False"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Standard"
CanUserAddRows="False"
CanUserDeleteRows="False"
EnableRowVirtualization="True"
SelectionMode="Extended"
SelectionUnit="FullRow"
IsReadOnly="False"
>
<DataGrid.Columns>
<DataGridCheckBoxColumn IsReadOnly="False"
local:DataGridExtender.ColumnId="ColIsChecked"
/>
<DataGridTextColumn IsReadOnly="True"
local:DataGridExtender.ColumnId="ColName"
Binding="{Binding Name}"
/>
</DataGrid.Columns>
</DataGrid>
列毎に設定するのはもう仕方ない。
これを設定することで、さっきできなかった事ができるようになる。

foreach (var col in this.MyDataGrid) {
if (DataGridExtender.GetColumnID(col.Name) == "ColName") {
//列名がColNameだったら、YYYYをする。
}
}

できそうな事
・実装次第では、列の並び換えの記憶、列の幅、表示/非表示、ソートの記憶(列を特定できるので)
・列を指定してのスクロール制御等。
課題
・列IDは一意である必要があるけど、チェック機構はない。自分で実装する必要がある。
・x:Nameプロパティとは何の連携もないので、ある意味、名前の二重定義になる。

その気になれば、MVVMにおけるVMに列IDを持ち込めない事もないんだけど、持ち込んで何をするかって事が決まってないとあんまり意味はなかったりする。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


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

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

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

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

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。