WPF数据绑定:根据属性设置Listbox项目的文本颜色

8

我很确定这在WPF中可能是一些基础内容,但我对XAML语法还不熟悉,我正在努力理解它。

设置

我有一个LogItem类型--只是一个POCO:

public class LogItem
{ 
    public string Message {get;set;}
    public Color MessageColor {get;set;}
}

我在ViewModel中有一个LogItem列表:

    private ObservableCollection<LogItem> _logItems; 
    public ObservableCollection<LogItem> LogItems
    {
        get { return _logItems; }
        set
        {
            if (value != _logItems)
            {
                _logItems = value;
                OnPropertyChanged("LogItems");
            }
        }
    }

我的视图模型与视图绑定,这样我就可以执行以下操作:

<ListBox Grid.Row="0" Margin="0,10,0,0" Grid.ColumnSpan="3" Height="150" ItemsSource="{Binding LogItems}">

问题

假如我在LogItems中有一个MessageMessageColor属性,那么正确的XAML语法是什么,可以将项目文本的颜色绑定到我指定的颜色?(显然,我还需要设置显示文本绑定等。)


不要忘记将LogItem属性设置为public。否则,无法绑定到它们。 - Clemens
抱歉,我实际上是凭记忆写的。感谢您指出错误!我会进行编辑。 - SeanKilleen
1个回答

25
    <ListBox Grid.Row="0" Margin="0,10,0,0" Grid.ColumnSpan="3" Height="150" ItemsSource="{Binding LogItems}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Message}" Foreground="{Binding MessageColor}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

文本块 Foreground 需要一个 Brush 而不是一个 Color。就像 WPF 中的很多东西一样,有许多方法可以解决这个问题。以下是其中的几种方法:

  1. 将您的 viewModel 中的 MessageColor 属性更改为 Brush

    Brush MessageColor {get;set;}
    
    创建一个 SolidColorBrush 对象并将其绑定到您的颜色。
      <TextBlock Text="{Binding Message}">
          <TextBlock.Foreground>
             <SolidColorBrush Color="{Binding MessageColor}"/>
          </TextBlock.Foreground>
      </TextBlock>
    
    创建一个ColorToBrushConverter
    public class ColorToBrushConverter : IValueConverter
    {
          #region IValueConverter Members
    
          public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
          {
                 if (value == null) return Brushes.Black; // Default color
    
                 Color color = (Color)value;
    
                 return new SolidColorBrush(color);
          }
    
          public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
          {
                 throw new NotImplementedException();
          }
    
          #endregion
    }
    
    在 XAML 中,将转换器创建为静态资源。
    <Window.Resources>
        <local:ColorToBrushConverter x:Key="colorToBrushConverter"/>
    </Window.Resources>
    

    将它用于绑定中

    <TextBlock Text="{Binding Message}" Foreground="{Binding MessageColor, Converter={StaticResource colorToBrushConverter}"/>
    

    祝你好运


3
MessageColor 是一种颜色,而不是画笔。 <TextBlock.Foreground><SolidColorBrush Color="{Binding MessageColor}"/></TextBlock.Foreground> - franssu
谢谢你们两个的快速回复!我没有问题将其更改为画刷。不幸的是,我一段时间内不会接近代码,所以我会在今天下午标记它为已回答。感谢你们让我了解ItemTemplate和DataTemplate结构!迫不及待地想要有时间深入挖掘这些绑定。 - SeanKilleen
1
@SeanKilleen 我已经更新了我的答案,包括转换器方法。既然你正在学习阶段,熟悉尽可能多的方法是很好的。玩得开心 :) - Omri Btian
@Omribitan,你可以像franssu所示的那样,在XAML中创建一个带有绑定颜色属性的SolidColorBrush,而不是添加一个ColorToBrushConverter。这样会简单得多。 - Clemens
@Clemens 我也加了那个。这是WPF。你可能会找到大约10种方法来做这件事。只是想发布几个选项,因为Sean Killeen说他对这一切都很新,我认为知道你的选择是好的。一旦你知道了,当然最好还是用更简单的方法来做 :) - Omri Btian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接