none
DataTemplate内のコントロールプロパティの変更 RRS feed

  • 質問

  • 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 を参考にさせて頂きました。

    何かよいアイデアがありましたら、ご教授下さい。よろしくお願い致します。
    2010年3月1日 11:35

回答

  • 二つほど考えつきます。

    一つは、PropertyGroupDescription の派生クラスを作って GroupNameForItem をオーバーライドし、返すグループ名を [プロパティ名:値] の形にしてしまうこと。
    HeaderTemplate の記述は簡単になりますが(TextBlock 一つに Name を Bindging しておしまい)、値部分だけ赤字とかになると IValueConveter を駆使することになります。

    もう一つは、VM や DynamicResource などにプロパティ名表示用の領域を用意し、TextBlock.Text に Binding する方法です。
    ちなみに VM を Binding する場合、HeaderTemplate 内の DataContext は CollectionViewGroup になっているので、バインディングソースを明示する必要があります。
    • 回答としてマーク higashi4711 2010年3月2日 11:02
    2010年3月1日 13:19

すべての返信

  • 二つほど考えつきます。

    一つは、PropertyGroupDescription の派生クラスを作って GroupNameForItem をオーバーライドし、返すグループ名を [プロパティ名:値] の形にしてしまうこと。
    HeaderTemplate の記述は簡単になりますが(TextBlock 一つに Name を Bindging しておしまい)、値部分だけ赤字とかになると IValueConveter を駆使することになります。

    もう一つは、VM や DynamicResource などにプロパティ名表示用の領域を用意し、TextBlock.Text に Binding する方法です。
    ちなみに VM を Binding する場合、HeaderTemplate 内の DataContext は CollectionViewGroup になっているので、バインディングソースを明示する必要があります。
    • 回答としてマーク higashi4711 2010年3月2日 11:02
    2010年3月1日 13:19
  • ご教授ありがとうございます。

    後者の方法、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"] = "年齢(裏から設定):";
    --

    でも反映されることを確認しました。

    以上、大変助かりました。
    今後ともよろしくお願いします。

    2010年3月2日 11:01