WPF,XAML:如何使用样式列表框上的ItemsSource对象的属性绑定一个ListBoxIte

2019-07-02 11:57发布

我有这势必日志消息的的ObservableCollection一个ListBox。

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:

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

所述AlternationConverter被使用,因为消息的严重性参数是int类型(0..3)的,我们可以很容易地使用一个样式之间切换。

这个概念是明确的,但到目前为止,并没有为我工作。 一个ListBoxItem的背景颜色没有改变。

Answer 1:

使用ItemContainerStyle

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


Answer 2:

像博扬评论说,这是它不应该是那里的RelativeSource。 使用{绑定路径=严重性,转换器= {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}">

但是,这只是一个个人喜好....你有什么应该正常工作,如果你修复的结合。



文章来源: WPF, XAML: How to style a ListBoxItem using binding on property of ListBox ItemsSource object?