トップ回答者
DataTemplate内のコントロールプロパティの変更

質問
-
DataTemplate内で設定しているコントロールについて、使用する際にコード側(もしくはxaml側)から個々のプロパティを変更することは可能でしょうか?
--
<DataTemplate x:Key="headerTemplate">
<StackPanel Grid.Column="0" Orientation="Horizontal">
<TextBlock Text="hoge:" Name="hoge"/>
<TextBlock Text="{Binding Path=Name}" />
</StackPanel>
</DataTemplate>
--
Resourcesファイルで定義した上記DataTemplate のhogeという名前のTextBlockのプロパティを、使用する際に動的に変えられないか悩んでいました。
状況としては、ListViewにおいてGroupStyleを使用してグループ化をしたいと考えているのですが、そのHeaderTemplate内に「グループ化した要素の種別」(PropertyGroupDescriptionがageなら「年齢」、sexなら「性別」等)を書きたいと思っています。
(上記コード内の「Text="hoge:"」の部分を、場合によって「性別:」にしたり「年齢:」にしたり、といった感じです)
リストの種類が多いため、HeaderTemplateを用いて見た目の統一を図り、かつ柔軟にTextを変えれないか、という事です。
グループ化に関してはかずきさんのブログ http://blogs.wankuma.com/kazuki/archive/2008/08/10/152511.aspx を参考にさせて頂きました。
何かよいアイデアがありましたら、ご教授下さい。よろしくお願い致します。
回答
-
二つほど考えつきます。
一つは、PropertyGroupDescription の派生クラスを作って GroupNameForItem をオーバーライドし、返すグループ名を [プロパティ名:値] の形にしてしまうこと。
HeaderTemplate の記述は簡単になりますが(TextBlock 一つに Name を Bindging しておしまい)、値部分だけ赤字とかになると IValueConveter を駆使することになります。
もう一つは、VM や DynamicResource などにプロパティ名表示用の領域を用意し、TextBlock.Text に Binding する方法です。
ちなみに VM を Binding する場合、HeaderTemplate 内の DataContext は CollectionViewGroup になっているので、バインディングソースを明示する必要があります。- 回答としてマーク higashi4711 2010年3月2日 11:02
すべての返信
-
二つほど考えつきます。
一つは、PropertyGroupDescription の派生クラスを作って GroupNameForItem をオーバーライドし、返すグループ名を [プロパティ名:値] の形にしてしまうこと。
HeaderTemplate の記述は簡単になりますが(TextBlock 一つに Name を Bindging しておしまい)、値部分だけ赤字とかになると IValueConveter を駆使することになります。
もう一つは、VM や DynamicResource などにプロパティ名表示用の領域を用意し、TextBlock.Text に Binding する方法です。
ちなみに VM を Binding する場合、HeaderTemplate 内の DataContext は CollectionViewGroup になっているので、バインディングソースを明示する必要があります。- 回答としてマーク higashi4711 2010年3月2日 11:02
-
ご教授ありがとうございます。
後者の方法、DynamicResource を使用することで実現できました。
--
<DataTemplate x:Key="headerTemplate">
<StackPanel Grid.Column="0" Orientation="Horizontal">
<TextBlock Text="{DynamicResource GroupNameString}" />
<TextBlock Text="{Binding Path=Name}" />
</StackPanel>
</DataTemplate>
--
とResourcesファイルに記述した上で、以下をそれぞれの画面で定義しました。
--
xmlns:System="clr-namespace:System;assembly=mscorlib"
--
<System:String x:Key="GroupNameString">年齢:</System:String> //Resources内に記述
--
さらに、コードビハインドから
--
Resources["GroupNameString"] = "年齢(裏から設定):";
--
でも反映されることを確認しました。
以上、大変助かりました。
今後ともよろしくお願いします。