2013-11-20 93 views
8

我有一個WPF列表框,其中包含一個來自特定類的項目的綁定列表。事情是這樣的:列表框項目WPF,不同項目的不同背景顏色

ObservableCollection<MyTable> tables = new ObservableCollection<MyTable>(); 
... 
    listTables.ItemsSource = tables; 

而XAML:

<ListBox HorizontalAlignment="Left" Margin="8,10,0,0" Name="listTables" Width="153" ItemsSource="{Binding tables}" SelectionChanged="listTables_SelectionChanged" Height="501" VerticalAlignment="Top"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid Margin="1"> 
        <TextBlock Grid.Column="1" Text="{Binding tableName}" /> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

一切工作正常。我現在想要做的是對ListBox中的每個項目有不同的背景,具體取決於類的某個屬性。例如,假設MyTable類有一個名爲isOccupied的屬性。如果這個標誌是爲某個項目設置的,我希望它在ListBox中有一個紅色背景,如果它不是,那麼我想讓它具有綠色背景。如果該屬性發生變化,則背景應相應更改。

有關如何實現此目的的任何提示?我現在正在查找有關ItemContainerStyle的一些信息,但是我對此比較陌生,所以我不確定是否遵循正確的路徑。

回答

13

可以實現,使用DataTriggers

<ListBox.ItemTemplate> 
    <DataTemplate> 

     <!-- Step #1: give an x:Name to this Grid --> 
     <Grid Margin="1" x:Name="BackgroundGrid"> 
      <TextBlock Grid.Column="1" Text="{Binding tableName}" /> 
     </Grid> 

     <!-- Step #2: create a DataTrigger that sets the Background of the Grid, depending on the value of IsOccupied property in the Model -->    
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding IsOccupied}" Value="True"> 
       <Setter TargetName="BackgroundGrid" Property="Background" Value="Red"/> 
      </DataTrigger> 

      <DataTrigger Binding="{Binding IsOccupied}" Value="False"> 
       <Setter TargetName="BackgroundGrid" Property="Background" Value="Green"/> 
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

請記住,如果你希望這些值在運行時改變,你的數據項必須正確實施,提高Property Change Notifications

public class MyTable: INotifyPropertyChanged //Side comment: revise your naming conventions, this is not a table. 
{ 
    private bool _isOccupied; 
    public bool IsOccupied 
    { 
     get { return _isOccupied; } 
     set 
     { 
      _isOccupied = value; 
      NotifyPropertyChange("IsOccupied"); 
     } 
    } 

    //.. Other members here.. 
} 
+0

你可能還有eran的舊+1。 ;) – Sheridan

+0

這非常有幫助,就像一個魅力。非常感謝你! – mmvsbg

0
<Style TargetType="ListBox" x:Key="myListBoxStyle"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding SelectedItem.IsOccupied}" Value="True"> 
      <Setter Property="Background" Value="Red" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
+0

+1現在有一個正確的答案......對解釋(對於那些需要的用戶)有一點點解釋,但一個正確的答案都是一樣的。 – Sheridan

+0

@Sheridan你確定這將實現OP的要求嗎?檢查我的答案 –

+0

+0您完全正確@HighCore ...謝謝,我需要更多的關注,當我在這個網站上。這不僅不會起作用,而且即使它按照eran計劃工作,它也只會在選定的項目上起作用。 – Sheridan

相關問題