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>

TextBlockは ではないことをForeground期待しています。WPF の多くのことと同様に、これにアプローチする方法はたくさんあります。ここにカップルがあります:BrushColor

  1. MessageColorviewModel のプロパティを次のように変更します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 に答える