2016-08-13 24 views
0

各アイテムの背景色は、選択状態とデータコンテキストのブール値プロパティの2つに依存するリストがあります。私は背景色をバインドする方法を考え出しましたが、リストアイテムを選択するとすぐに私のカスタム背景が消えます。リストボックスアイテムの背景と選択色をWPFで

最終結果は、データコンテキストブール値が真である場合は緑のシェード、偽の場合は赤のシェードであることが理想的です(選択状態によって異なります)。

MainWindow.xaml:

<ListBox x:Name="CrewList" ItemsSource="{Binding CrewList}" SelectedItem="{Binding SelectedCrew}" Style="{StaticResource EventOverviewListBox}" Grid.Column="1" Grid.Row="0"> 
      <ListBox.ItemContainerStyle> 
       <Style TargetType="{x:Type ListBoxItem}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Data.IsValid}" Value="true"> 
          <Setter Property="Background" Value="{StaticResource StatusValid}"/> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding Data.IsValid}" Value="false"> 
          <Setter Property="Background" Value="{StaticResource StatusInvalid}"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ListBox.ItemContainerStyle> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal" Margin="10,10,10,10" KeyboardNavigation.IsTabStop="False"> 
         <TextBlock Text="{Binding Lane}" Margin="0,0,20,0" FontSize="20" /> 
         <TextBlock Text="{Binding ClubName}" Foreground="Black" VerticalAlignment="Center"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

App.xaml:

<SolidColorBrush x:Key="StatusValid">LawnGreen</SolidColorBrush> 
    <SolidColorBrush x:Key="StatusInvalid">Red</SolidColorBrush> 
    <Style x:Key="EventOverviewListBox" TargetType="ListBox"> 
     <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/> 
     <Setter Property="HorizontalAlignment" Value="Stretch"/> 
     <Setter Property="VerticalAlignment" Value="Stretch"/> 
     <Setter Property="Background" Value="Teal"/> 
    </Style> 
    <Style x:Key="EventOverviewListBoxItem" TargetType="ListBoxItem"> 
     <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/> 
    </Style> 

私が検索し、検索さが、時間の最後のカップルには何も見つかっていないので、私は願っていました他の誰かが方法を知っている。

ありがとうございます!

+0

あなたが "選択状態" とはどういう意味ですか?私が正しく理解している場合、アイテムが選択されていない場合は、背景がデフォルトのものでなければなりませんが、アイテムが選択されていれば、StatusValidまたはStatusInvalidです。私は正しい? – GregaMohorko

答えて

1

「選択状態」とは、アイテムが選択されているかどうかを意味します。

ListBoxItemには、トリガーがトリガーよりも優先されるControlTemplateがあります。 ListBoxItemスタイル用に独自のControlTemplateを作成する必要があります。 また、MultiDataTriggerを使用してください。このよう

<Style TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ListBoxItem"> 
       <Border Name="BorderWrap"> 
        <ContentPresenter /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
          <Condition Binding="{Binding RelativeSource={RelativeSource Self},Path=IsSelected}" Value="True" /> 
          <Condition Binding="{Binding Data.IsValid}" Value="True" /> 
         </MultiDataTrigger.Conditions> 
         <MultiDataTrigger.Setters> 
          <Setter TargetName="BorderWrap" Property="Background" Value="{StaticResource StatusValid}"/> 
         </MultiDataTrigger.Setters> 
        </MultiDataTrigger> 
        <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
          <Condition Binding="{Binding RelativeSource={RelativeSource Self},Path=IsSelected}" Value="True" /> 
          <Condition Binding="{Binding Data.IsValid}" Value="False" /> 
         </MultiDataTrigger.Conditions> 
         <MultiDataTrigger.Setters> 
          <Setter TargetName="BorderWrap" Property="Background" Value="{StaticResource StatusInvalid}"/> 
         <MultiDataTrigger.Setters> 
        </MultiDataTrigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+1

はい、ありがとうございます! 'MultiDataTrigger'は美しく動作しました。私は条件とセッターを ''と ''でそれぞれラップするだけでした。 – mightimaus

関連する問題