(前提)
WPFのDataGridについて質問です。
横軸が、可変個数の日付をヘッダーにしたDataGridを作っています。
横軸の要素数が可変なので、XAMLで固定で書くことはできず、コードビハインドで、DataContextChangedのイベントで、バインドしたデータを元に動的に作成しています。
ここで、以前似たようなことをしていた時は、単に文字列として表示できれば良かったのですが、今回は、表示する要素が複雑なのです。各セルの内容に、さらに、複数の要素の可変個数のコレクションを内包した要素を表示し、さらに編集もしたいのです。
DataGridのセル1つの中に、さらにネストしてListBoxが複数並んでいるようなイメージです。
ここで、固定の列をXAMLで書くのならば、DataGridTemplateColumnとして、内部にListBoxなどを配置したものを定義すればよいわけですが、これをコードでなく、コードビハインドでやろうとすると、
①肝心のDataTemplate自体がコードでは作れない??
②強引に、DataTemplate自体はXAMLでResourcesの中に定義して、FindResourceでそれを持ってきても、コードからバインディングを設定することが、TextColumnだと簡単にできたのに、TemplateColumnだとそれが不可能??
③XAMLの方でDataTemplate内で直接バインドを指定してしまうのは、バインド先が固定なら問題ないのですが、可変行のため、実際は列0,1,2...に対して、バインド先コレクション[0],[1],[2],....と、インデクサ経由でバインドさせないといけないので、今回の場合XAML内で指定もできない。
というような問題で、行き詰ってしまっています。
(質問1)
コードビハインドから、動的にDataGridTemplateColumnをコードで作成して、コレクション[0],[1],[2]…に順次データバインドさせる、そんなことは可能なのでしょうか?
******************************
上記の、DataGridTemplateColumnを作ってバインドさせる方法が行き詰ってしまっているので、とりあえず、セル内にネストして配置したかったListBoxで表示させる内容を、全て改行区切りで連結させて1つの文字列にしてしまって、DataGridTextColumを使って、単なる改行付の文字列として表示だけはさせるものを作ってみました。
こちらで、セルの内容をToolTipとして表示させたく(セルとして並べるので横幅をあまり取りたくない、しかし全文確認できないと困るので)、次のようにXAMLでStyleを設定しています(そしてこれを、コードビハインドでDataGridTextColumnを追加する際に、FindResourceで読み込んで、CellStyleに設定しています。
<Style TargetType="{x:Type DataGridCell}" x:Key="style1"><Setter Property="ToolTip" Value="{Binding Path=Content, RelativeSource={RelativeSource Mode=Self},Mode=OneWay}"/></Style>
そうすると、DataGridのセルの上にマウスを持っていくと、その内容がちゃんとToolTipで表示されるのですが、表示した瞬間、代わりに、肝心のDataGridのセルの中身がクリアされてしまうという怪現象が起きています。
(質問2)
上のXAMLの指定が悪いのでしょうか? DataGridTextColumnの文字列の内容を、そのままToolTipで表示したいだけなのですが、どうすればよいでしょうか?
以上よろしくお願いします。