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

Sea*_*een 8 c# wpf xaml listbox mvvm

我敢肯定这可能是WPF中的基本内容,但我是XAML语法的新手,我正试图绕过它.

安装程序

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

public class LogItem
{ 
    public string Message {get;set;}
    public Color MessageColor {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

LogItem我的ViewModel中的List :

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

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

<ListBox Grid.Row="0" Margin="0,10,0,0" Grid.ColumnSpan="3" Height="150" ItemsSource="{Binding LogItems}">
Run Code Online (Sandbox Code Playgroud)

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

问题

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

Omr*_*ian 24

    <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>
Run Code Online (Sandbox Code Playgroud)

TextBlock Foreground期望Brush不是a Color.就像WPF中的很多东西一样,有很多方法可以解决这个问题.这是一对夫妇:

  1. 更改为MessageColorviewModel中的属性Brush

    Brush MessageColor {get;set;}
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个SolidColorBrush并将其绑定到您的颜色

      <TextBlock Text="{Binding Message}">
          <TextBlock.Foreground>
             <SolidColorBrush Color="{Binding MessageColor}"/>
          </TextBlock.Foreground>
      </TextBlock>
    
    Run Code Online (Sandbox Code Playgroud)
  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
    }
    
    Run Code Online (Sandbox Code Playgroud)

在xaml中,将转换器创建为静态资源

<Window.Resources>
    <local:ColorToBrushConverter x:Key="colorToBrushConverter"/>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

在绑定中使用它

<TextBlock Text="{Binding Message}" Foreground="{Binding MessageColor, Converter={StaticResource colorToBrushConverter}"/>
Run Code Online (Sandbox Code Playgroud)

祝好运

  • MessageColor是一个Color,而不是Brush .. <TextBlock.Foreground> <SolidColorBrush Color ="{Binding MessageColor}"/> </ TextBlock.Foreground> (3认同)