gpt4 book ai didi

c# - WPF 绑定(bind) : Set Listbox Item text color based on property

转载 作者:太空狗 更新时间:2023-10-29 18:05:57 25 4
gpt4 key购买 nike

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

我的 View 模型已绑定(bind)到 View ,因此我可以执行以下操作:

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

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

问题

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

最佳答案

    <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 并将其绑定(bind)到您的颜色

      <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>

在绑定(bind)中使用它

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

祝你好运

关于c# - WPF 绑定(bind) : Set Listbox Item text color based on property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18982150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com