【问题标题】:WPF, XAML: How to style a ListBoxItem using binding on property of ListBox ItemsSource object?WPF,XAML:如何使用 ListBox ItemsSource 对象的属性绑定来设置 ListBoxItem 的样式?
【发布时间】:2009-08-20 10:04:59
【问题描述】:

我有一个绑定到 LogMessages 的 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...
}

ListBox 充满了这些项目,我需要 color-code(更改 ListBoxItembackground color)列表,具体取决于LogMessage 项的 Severity 参数。

这是我现在在 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 是因为 message 的 Severity 参数是 Int (0..3) 类型,我们可以使用它轻松地在样式之间切换。

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

【问题讨论】:

  • 我的直觉是这与 {RelativeSource TemplatedParent} 有关。调试应用程序时是否在输出窗口中出现任何绑定错误?
  • 没有绑定错误,但不幸的是你是对的,这与我试图引用的对象无关。奇怪的是,输出窗口中没有绑定错误。

标签: wpf xaml binding listbox styling


【解决方案1】:

使用ItemContainerStyle:

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

【讨论】:

    【解决方案2】:

    就像 Bojan 评论的那样,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}">
    

    但这只是个人喜好....如果您修复绑定,您所拥有的应该可以正常工作。

    【讨论】:

    • 我已经用 Kent 的解决方案解决了这个问题,但我也会试试你的。当然,它在某些外部情况下可能很有用。使用 AlternationConverter 的目的是它可以轻松地解释我们在 LogMessage 中拥有的整数数据。您的方法更通用,因此将适用于更多情况。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多