我确信这可能是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中有Message
和MessageColor
属性,将项目文本的颜色绑定到我指定的颜色的正确XAML语法是什么?
答案 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中的很多东西一样,有很多方法可以解决这个问题。这是一对夫妇:
将viewModel中的MessageColor
属性更改为Brush
Brush MessageColor {get;set;}
创建SolidColorBrush
并将其绑定到您的颜色
<TextBlock Text="{Binding Message}">
<TextBlock.Foreground>
<SolidColorBrush Color="{Binding MessageColor}"/>
</TextBlock.Foreground>
</TextBlock>
创建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}"/>
祝你好运