WPF绑定:根据属性设置列表框项文本颜色

时间:2013-09-24 12:52:12

标签: c# wpf xaml mvvm listbox

我确信这可能是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");
            }
        }
    }

我的viewmodel绑定到视图,以便我可以执行以下操作:

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

(显然我还是要设置显示文本绑定等)

问题

鉴于我在LogItems中有MessageMessageColor属性,将项目文本的颜色绑定到我指定的颜色的正确XAML语法是什么?

1 个答案:

答案 0 :(得分:23)

    <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
    }
    
  4. 在xaml中,将转换器创建为静态资源

    <Window.Resources>
        <local:ColorToBrushConverter x:Key="colorToBrushConverter"/>
    </Window.Resources>
    

    在绑定中使用它

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