2009-08-20 57 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

相关问题