2016-08-13 87 views
0

我有一個列表,其中每個項目的背景顏色應該取決於兩件事情:選擇狀態和數據上下文中的布爾屬性。我已經想出瞭如何綁定背景顏色,但只要我選擇列表項,我的自定義背景消失。在WPF中綁定列表框項目背景和選擇顏色

如果數據上下文布爾值爲true,則最終結果理想情況下(取決於選擇狀態)爲綠色,如果爲false,則爲紅色陰影。

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

相關問題