DataGridCellにツールチップ(Tooltip)を(弐)

DataGridCellにツールチップ(Tooltip)を(壱)の続き
DataGridCellにToolTipを表示させるため、Converterクラスを作ることにしたがが、その前に、課題にある「DataGridCellから表示内容を取得する」為に、関係するプロパティ名を取得する拡張メソッドを実装した。
/// <summary>
/// 指定のDataGridColumnに関係するパス(プロパティ名)を取得します。
/// </summary>
/// <param name="column">DataGridColumn</param>
/// <returns>DataGridColumnに関係するパス(プロパティ名)</returns>
public static string ResolveMemberPath(this DataGridColumn column) {

//DataGridTemplateColumnは、DataGridBoundColumn系ではないので、
//SortMemberPathを返します。
var path = column.SortMemberPath;

if (!string.IsNullOrEmpty(path)) {
return path;
}

//DataGridComboBoxColumn列なら、アイテムを表すDisplayMemberPathを返します。
if (column is DataGridComboBoxColumn) {
return ((DataGridComboBoxColumn)column).DisplayMemberPath;
}

//DataGridBoundColumn 系の列で、Data Bindingされているなら、
//そのBinding情報からPathを取得して返します。
var binding = (column as DataGridBoundColumn)?.Binding as Binding;

if (!string.IsNullOrEmpty(binding?.XPath)) {
return binding.XPath;

} else if (binding?.Path != null) {
return binding.Path.Path;
}

return path;
}
ん。null演算子を使うと、それなりにすっきりする。仕事ではまだつかえないけど( ノД`)。拡張メソッドにしてあるので、staticクラスに実装している。これを使って、Converterクラスを実装する。なお、このメソッドは、今回以外にも使える有能さんだったことが後で判明した。続きを読む
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

DataGridCellにツールチップ(Tooltip)を(壱)

WPF4でアプリ開発を始めて、少し経った頃の話。

後輩:ちょっと良いっすか。
俺:だめ。
後輩:DataGridって、列幅を狭めるとセルの中身が一部しか見えなくなるじゃないっすか。
俺:聞けよ。まあ、そうだね。
後輩:そういうときって、ツールチップ出せないっすか?
俺:ああー、ツールチップかー。まあちょっと調べようか。


列いっぱい(40~50)、文字列いっぱい(最大500文字)のデータをDataGridに表示する時、内容を参照するために逐一列を広げるのはめんどくさい。確かに欲しいよなぁと思いながら、やっぱりここだよね!とStackOverflowを調べる。

俺:これなんかどうっす?
後輩:どうっす?おお。とりあえず使ってみるっす。

しばらくして、後輩が再び来襲。

後輩:先輩、さっきの奴、ちょっと駄目っすね。
俺:ちょっと駄目っすか。
後輩:ええ。こいつ、DataGridTemplateColumnで使うと、ツールチップが出ないっすね。後、中身が空でもToolTipが出るっすよ。
俺:出てるっすね。
後輩:空の時、(ツールチップ)いらないっすよね?ええ、いらないです。というわけで、どうにかしてほしいっす。
俺:それ、「ちょっと」じゃないだろ。

しかし、調べても良い情報が出てこない。やっぱり上の記事が一番使えそうだった。仕方ないので、上の記事から発展させることにした。
課題は二点。
〇DataGridTemplateColumnでは使えない。
 DataGridTemplateColumn以外は、何とかなりそうなのに。 確かに、DataTemplateは、その気さえあれば、いくつものコントロールを組み合わせられるので、どこから値を取得して良いかはわからない。そこで、Converterを使って、ToolTipに表示する文字列を取得する事にした。手順はこんな感じ。
1.ToolTip対象のDataGridCellにバインドされるプロパティ名を取得する。
  列のソートに必要な、SortMemberPathプロパティ名が設定されていれば、それを使う。なければ、Binding情報から取得する事にしよう。
2.取得したプロパティ名から値を取得する。
 Bindingが使っている、TypeDescriptorを使って取得することにした。結局中身はReflectionかな。

〇セルの中身が空でもToolTipが出てくる。
 セルの中身が空かどうかなんて意識していないし、Visibiityプロパティに何も設定していない。
 セルに表示される内容を取得できたら、後はそれをVisibilityに変えるだけなので、上の課題をクリアできたら何とかなるか。

続く
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

C#5もぼちぼちなんだが。

What's New in C# 6
What's new in C# 7
ユーザーさんたちが使うPCの一部では、まだWindows7が現役だったりするのもあるし、一度リリースしたら、おいそれと変えられないという事情で、仕事では、.NET4 Framwwork(C#4)がメインだったりする。まあしかし、勉強しても損ではないし。使わずともどんな使い方になるかを読んでおくべきかな。
しかし、C#を1.1から勉強する新人さんたちは大変だな。教える側も内容を考えないといけないな。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0

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

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

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

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