2017-12-26 3 views
0

を選択した場合、私は次のスタイルがあります。変更プロパティ

<Style.Triggers> 
      <Trigger Property="IsSelected" Value="True"> 
       <Setter Property="ContentTemplate"> 
        <Setter.Value> 
         <DataTemplate> 
          <TextBlock x:Name="Text" Text="{Binding Name}" Margin="0, 5" FontSize="16"/> 
         </DataTemplate> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
     </Style.Triggers> 

を私は「ListBoxItem」を選択した場合は「テキスト」の前景色を変更したいです。私はここから知っています:Change WPF DataTemplate for ListBox item if selected DataTemplateを変更する方法。色を変更したいだけなので、このソリューションはcoddで不要な重複をします - 私のDataTemplateが非常に複雑で長い場合、大きな問題になります。

どのように私は、オブジェクト DataTemplateを内部単一のプロパティの変化を達成できますか?

答えて

0

実際に同じアイテムテンプレートが常に(アイテムが選択されているかどうかにかかわらず)、アイテムが選択されているときに前景色が異なるようにしたい場合は、簡単です。 ContentTemplateは変更されないため、トリガーでContentTemplateを設定しないでください。トリガーで前景色を設定するだけです。テンプレートの前景色を混乱させない場合は、it will inherit whatever the ListBoxItem has for that property

<Style TargetType="ListBoxItem"> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <TextBlock 
        x:Name="Text" 
        Text="{Binding Name}" 
        Margin="0, 5" 
        FontSize="16" 
        /> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Foreground" Value="Red" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

同じスタイルのより精巧なバージョン:最初の私は、あなたが「ListBoxItem」のForegroundプロパティを変更したので、それが動作しないだろうと思った時に

<Style TargetType="ListBoxItem"> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <Ellipse 
         Height="12" 
         Width="12" 
         VerticalAlignment="Center" 
         x:Name="Ellipse" 
         Fill="Yellow" 
         Stroke="DeepSkyBlue" 
         StrokeThickness="1" 
         /> 
        <TextBlock 
         x:Name="Text" 
         Text="{Binding Name}" 
         Margin="5,5,0,5" 
         FontSize="16" 
         /> 
       </StackPanel> 
       <DataTemplate.Triggers> 
        <DataTrigger 
         Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" 
         Value="True" 
         > 
         <Setter 
          TargetName="Ellipse" 
          Property="Stroke" 
          Value="Orange" 
          /> 
         <Setter 
          TargetName="Ellipse" 
          Property="StrokeThickness" 
          Value="3" 
          /> 
        </DataTrigger> 
       </DataTemplate.Triggers> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Foreground" Value="Red" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
+0

、およびありません"テキストボックス"。しかし、それはうまくいきました...私はなぜ、あなたは同じ効果を達成するでしょうか?たとえば、2つのテキストボックスがあり、1つだけの色を変更したい場合などです。 –

+0

@ ShacharHar-Shuv更新を参照してください:ターゲットトリガーの詳細を示すテンプレートを追加し、依存関係プロパティ値の継承に関する記事をリンクしました。 –

関連する問題