C# 动态更改代码隐藏(WPF)中列表框项目的颜色

C# 动态更改代码隐藏(WPF)中列表框项目的颜色,c#,wpf,listbox,C#,Wpf,Listbox,我有一个交通申请。灯光状态在列表框中更新 <ListBox x:Name="lbxCallProgress" ItemsSource="{Binding Messages,Mode=TwoWay}" Height="373" FontSize="8" ScrollViewer.VerticalScrollBarVisibility="Visible"> <ListBox.ItemTemplate> <DataTemplate

我有一个交通申请。灯光状态在列表框中更新

<ListBox x:Name="lbxCallProgress"  ItemsSource="{Binding Messages,Mode=TwoWay}" Height="373" FontSize="8" ScrollViewer.VerticalScrollBarVisibility="Visible">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    void UpdateMessage(string message)
    {
        try
        {
            Dispatcher.BeginInvoke((Action)delegate()
            {
                Dispatcher.BeginInvoke(new Action(() => { this.Messages.Add(message); }));
            });
        }
现在,如果字符串
message
包含关键字“green”,那么我想将列表框上的项目颜色设置为绿色,以此类推

怎么做

给你

借助WPF绑定的强大功能,您可以使用该值绑定到所需的属性
Background
,隐式转换器将为您完成其余的工作

    <DataTemplate>
        <TextBlock Text="{Binding}" Background="{Binding}"/>
    </DataTemplate>
用法



前台=“{Binding}”字符串是可变的吗?或者它们在整个生命周期内都会保持不变?@Herdo,是的,字符串是可变的。为什么要使用委托添加到消息中?@Blam,我不知道。我从某处借用了这段代码。有一个隐式转换器,可以自动将“随机(下/上)”大小写颜色名称(作为普通字符串)转换为
System.Windows.Media.Brush
?嗨,我需要更多的代码。颜色可以是黄色、绿色和红色。例如,如果
消息
是“灯是红色的”,那么如何将其绑定到红色?如果
消息
是“10秒后,颜色将为绿色”,那么如何?@Love,在这种情况下,转换器可以帮助您。您可能需要定义图案,例如在何处找到颜色。例如
如何识别
颜色
红色
从句子
灯是红色的
@pushpraj,我想要类似
的东西,如果message.Contains(“red”)
,然后更改颜色。@Herdo隐式转换器能够从大写或小写颜色名称转换,只要它们来自颜色名称列表。您可以参考以下列表:
    <DataTemplate>
        <TextBlock Text="{Binding}" Background="{Binding}"/>
    </DataTemplate>
public class MyColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string text = value as string;

        if(text.Contains("red"))
           return Brushes.Red;

        return Brushes.White;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return DependencyProperty.UnsetValue;
    }
}
<DataTemplate xmlns:l="your namespace to converter class">
    <DataTemplate.Resources>
        <l:MyColorConverter x:Key="MyColorConverter" />
    </DataTemplate.Resources>
    <TextBlock Text="{Binding}" Background="{Binding Converter={StaticResource MyColorConverter}}"/>
</DataTemplate>