2009-08-20 24 views
17

我有一個ListBox綁定到LogMessages的ObservableCollection。WPF,XAML:如何使用ListBox ItemsSource對象的屬性上的綁定來設置ListBoxItem的樣式?

public ObservableCollection<LogMessage> LogMessages { get; set; } 
public LogMessageData() 
{ 
    this.LogMessages = new ObservableCollection<LogMessage>(); 
} 

每個消息有兩個參數:

public class LogMessage 
{ 
    public string Msg { get; set; } 
    public int Severity { get; set; } 
    //code cut... 
} 

列表框是越來越填充有那些項目,並且我需要顏色編碼(改變背景顏色的 ListBoxItem的)列表取決於LogMessage項目的嚴重性參數。

這就是我現在在XAML顯示日誌用戶控件:

<UserControl.Resources> 
    <AlternationConverter x:Key="BackgroundSeverityConverter"> 
     <SolidColorBrush>Green</SolidColorBrush> 
     <SolidColorBrush>Yellow</SolidColorBrush> 
     <SolidColorBrush>Red</SolidColorBrush> 
    </AlternationConverter> 
    <Style x:Key="BindingAlternation" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Background" 
       Value="{Binding RelativeSource={RelativeSource TemplatedParent}, 
       Path=Severity, 
       Converter={StaticResource BackgroundSeverityConverter}}"/> 
    </Style> 
    <DataTemplate x:Key="LogDataTemplate"> 
     <TextBlock x:Name="logItemTextBlock" Width="Auto" Height="Auto" 
     Text="{Binding Msg}"/> 
    </DataTemplate> 
</UserControl.Resources> 

和實際列表框:

<ListBox IsSynchronizedWithCurrentItem="True" 
    ItemTemplate="{DynamicResource LogDataTemplate}" 
    ItemsSource="{Binding LogFacility.LogMessages}" 
    x:Name="logListBox" Grid.Row="1" 
    ItemContainerStyle="{StaticResource BindingAlternation}" /> 

的AlternationConverter被使用,因爲消息的嚴重性參數的類型的Int(0..3),我們可以輕鬆地在使用那個樣式的樣式之間切換。

這個概念很清楚,但到目前爲止它不適用於我。 ListBoxItem的背景顏色沒有改變。

+0

我的預感是,這與{RelativeSource TemplatedParent}有關。調試應用程序時,在輸出窗口中是否有任何綁定錯誤? – 2009-08-20 10:30:34

+0

沒有綁定錯誤,但不幸的是你是對的,這與我試圖引用的對象無關。奇怪的是輸出窗口沒有綁定錯誤。 – 2009-08-20 10:54:05

回答

30

使用ItemContainerStyle

<ListBox ItemsSource="{Binding LogMessages}"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Background" Value="{Binding Severity, Converter={StaticResource YourBackgroundConverter}}"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 
+0

謝謝,這對我來說就像一個魅力。 – 2009-08-20 10:56:31

4

像博揚評論說,這是它不應該是那裏的RelativeSource。 使用當綁定到數據對象時,{Binding Path = Severity,Converter = {StaticResource BackgroundSeverityConverter}}。 RelativeSource.TemplatedParent用於綁定到ListBoxItem。

此外,我的一個忌諱的東西,你可以考慮使用觸發器,例如:

<Style x:Key="BindingAlternation" TargetType="{x:Type ListBoxItem}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Severity}" Value="1"> 
      <Setter Property="Background" Value="Green"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Severity}" Value="2"> 
      <Setter Property="Background" Value="Yellow"/> 
     </DataTrigger> 
     <!-- etc.. --> 
    </Style.Triggers> 
<Style x:Key="BindingAlternation" TargetType="{x:Type ListBoxItem}"> 

但是,這只是一個個人喜好....你有什麼應該正常工作,如果你解決綁定。

+0

我已經解決了肯特解決方案的問題,但我也會嘗試你的解決方案。當然,這在某些情況下可能會有用。使用AlternationConverter的目的是它可以輕鬆解釋LogMessage中的整型數據。你的見解更一般,所以它會適用於更多的情況。謝謝! – 2009-08-20 10:55:57

相關問題