WPF,XAML:如何使用ListBox ItemsSource对象的属性绑定样式ListBoxItem?

Igo*_*lin 16 wpf xaml binding listbox styling

我有一个ListBox,它绑定到LogMessages的ObservableCollection.

public ObservableCollection<LogMessage> LogMessages { get; set; }
public LogMessageData()
{
    this.LogMessages = new ObservableCollection<LogMessage>();
}
Run Code Online (Sandbox Code Playgroud)

每条消息都有两个参数:

public class LogMessage
{
    public string Msg { get; set; }
    public int Severity { get; set; }
    //code cut...
}
Run Code Online (Sandbox Code Playgroud)

列表框是越来越充满了这些项目,我需要的颜色代码(改变背景颜色一个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>
Run Code Online (Sandbox Code Playgroud)

和一个实际的ListBox:

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

使用AlternationConverter是因为消息的Severity参数是Int(0..3)类型,我们可以使用该样式轻松切换样式.

这个概念很清楚,但到目前为止它对我不起作用.ListBoxItem的背景颜色没有改变.

Ken*_*art 29

用途ItemContainerStyle:

<ListBox ItemsSource="{Binding LogMessages}">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Background" Value="{Binding Severity, Converter={StaticResource YourBackgroundConverter}}"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
Run Code Online (Sandbox Code Playgroud)