Search code examples
c#wpfxamllistviewtextblock

getting textBlock from list view dynamically


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>

Solution

  • 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}}" />