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中有一个Message和MessageColor属性,将项目文本的颜色绑定到我指定的颜色的正确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中的很多东西一样,有很多方法可以解决这个问题.这是一对夫妇:
更改为MessageColorviewModel中的属性Brush
Brush MessageColor {get;set;}
Run Code Online (Sandbox Code Playgroud)创建一个SolidColorBrush并将其绑定到您的颜色
<TextBlock Text="{Binding Message}">
<TextBlock.Foreground>
<SolidColorBrush Color="{Binding MessageColor}"/>
</TextBlock.Foreground>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)创建一个 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)
祝好运