I have a ListView which contain 2 textBlocks as a listview Item
I want to color the textBlocks dynamically
how can I get do the textblock? will appreciate an example.
Thanks you for your support
attaching My XAML:
<ListView x:Name="LV" ItemsSource= "{Binding Lggv}" SelectionChanged="dataGridData_SelectionChanged" ItemContainerStyle="{StaticResource ListViewItemStyle}" >
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel >
<Border BorderThickness="1" BorderBrush="Black">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"></ColumnDefinition>
<ColumnDefinition Width="50"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock x:Name="tbHeader" Text="{Binding Info }" AllowDrop="True" FontWeight="Bold" Grid.Column="2" >
<TextBlock.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFCEE6C6" Offset="0.008"/>
<GradientStop Color="#FF9ECF8C" Offset="0.987"/>
</LinearGradientBrush>
</TextBlock.Background>
</TextBlock>
</Grid>
</Border>
<Grid x:Name="GridData" >
<Grid.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFC5DDFF" Offset="0"/>
<GradientStop Color="#FFA8C8F7" Offset="1"/>
</LinearGradientBrush>
</Grid.Background>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="150"></ColumnDefinition>
<ColumnDefinition Width="50"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" BorderThickness="2" BorderBrush="Black">
<TextBlock Text="{Binding DateTime}" ></TextBlock>
</Border>
<Border Grid.Column="1" BorderThickness="2" BorderBrush="Black">
<TextBlock Text="{Binding ComPort}"></TextBlock>
</Border>
<Border Grid.Column="2" BorderThickness="2" BorderBrush="Black">
<TextBlock Text="{Binding Data}" ></TextBlock>
</Border>
</Grid>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
The best way to do this is with a IValueConverter
as this allows you to keep your view and viewModel seperate, though if you don't care about that @sasanaf answer is perfertly correct
here is an example of a simple Brush based converter
public class PriorityConverter : IValueConverter
{
public Brush HighBrush { get; set; }
public Brush LowBrush { get; set; }
public Brush MediumBrush { get; set; }
public Brush DefaultBrush { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var priority = value as Priority?;
if (priority.HasValue)
{
switch (priority.Value)
{
case Priority.High:
return HighBrush;
case Priority.Medium:
return MediumBrush;
case Priority.Low:
return LowBrush;
default:
return DefaultBrush;
}
}
else
throw new InvalidCastException($"{value} is not a Priority");
}
You would then add the converter as a resource to your App,
<local:PriorityConverter x:Key="PriorityConverter" >
<local:PriorityConverter.DefaultBrush>
<SolidColorBrush Color="{DynamicResource {x:Static SystemColors.ControlColorKey}}"/>
</local:PriorityConverter.DefaultBrush>
<local:PriorityConverter.HighBrush>
<LinearGradientBrush>
<GradientStop Color="Red" Offset="0.5"/>
<GradientStop Color="Yellow" />
</LinearGradientBrush>
</local:PriorityConverter.HighBrush>
<local:PriorityConverter.MediumBrush>
<SolidColorBrush Color="Blue"/>
</local:PriorityConverter.MediumBrush>
<local:PriorityConverter.LowBrush>
<SolidColorBrush Color="Green"/>
</local:PriorityConverter.LowBrush>
</local:PriorityConverter>
and finally use it on your binding
<TextBlock Background="{Binding Priority, Converter={StaticResource PriorityConverter}}" />