【问题标题】:WPF binding: Set Listbox Item text color based on propertyWPF 绑定:根据属性设置列表框项文本颜色
【发布时间】:2013-09-29 16:49:33
【问题描述】:

我确信这可能是 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 属性。否则无法绑定到它们。
  • 对不起,我确实这样做了,但这是凭记忆写的。感谢您的捕获!我会编辑。

标签: c# wpf xaml mvvm listbox


【解决方案1】:
    <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>

TextBlock Foreground 需要 Brush 而不是 Color。就像 WPF 中的很多东西一样,有很多方法可以实现这一点。这是一对:

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

    Brush MessageColor {get;set;}
    
  2. 创建一个SolidColorBrush 并将其绑定到您的颜色

      <TextBlock Text="{Binding Message}">
          <TextBlock.Foreground>
             <SolidColorBrush Color="{Binding MessageColor}"/>
          </TextBlock.Foreground>
      </TextBlock>
    
  3. 创建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}"/>

祝你好运

【讨论】:

  • MessageColor 是颜色,而不是画笔。
  • 感谢两位的快速回复!我把它换成刷子没问题。不幸的是,我暂时不会靠近代码,所以今天下午我会将其标记为已回答。感谢您让我深入了解 ItemTemplate 和 DataTemplate 结构!迫不及待地想等到我出来呼吸一下,花点时间深入研究一下这个绑定。
  • @SeanKilleen 我已经更新了我的答案以包含转换器方法。由于您处于学习阶段,因此最好熟悉尽可能多的方法。玩得开心:)
  • @Omribitan 除了添加 ColorToBrushConverter 之外,您还可以在 XAML 中创建一个具有绑定 Color 属性的 SolidColorBrush,如 franssu 所示。这要简单得多。
  • @Clemens 我也添加了。这是WPF。您可能可以找到大约 10 种方法。只是想发布几个选项,因为 Sean Killeen 说他对这一切都很陌生,我认为了解您的选项很好。一旦你这样做了,当然最好用更简单的方式来做:)
猜你喜欢
  • 1970-01-01
  • 2019-02-12
  • 2021-11-10
  • 2017-01-02
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
相关资源
最近更新 更多