8

我确信这可能是 WPF 中的基本内容,但我对 XAML 语法很陌生,我正试图围绕它展开思考。

设置

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

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

以及LogItem我的 ViewModel 中的列表:

    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 中有一个MessageandMessageColor属性,将项目文本的颜色绑定到我指定的颜色的正确 XAML 语法是什么?

4

1 回答 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>

TextBlockForeground期望 aBrush不是Color. 就像 WPF 中的很多东西一样,有很多方法可以实现这一点。这是一对:

  1. MessageColor将 viewModel 中的属性更改为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}"/>

祝你好运

于 2013-09-24T12:57:33.250 回答