WPF ListView Highlight Color don't change

后端 未结 3 2062
星月不相逢
星月不相逢 2021-01-15 23:40

I have a ListView with three TextBlock for each Item. The first one has the default color (black) and the others has the property Foreground set to gray.

When I sele

相关标签:
3条回答
  • 2021-01-16 00:10

    You could achieve what you are trying to do by converting your code from having DataTemplate for a ListViewItem to having a ControlTemplate

    This is what I tried:

    ListViewItem Style:

    <Style TargetType="ListViewItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <Border x:Name="ContentBorder"
                                    Background="{TemplateBinding Background}"
                                    BorderBrush="{TemplateBinding BorderBrush}"
                                    BorderThickness="{TemplateBinding BorderThickness}"
                                    Margin="4">
                        <Grid Height="86" Margin="2"  >
                            <Grid.RowDefinitions>
                                <RowDefinition Height="1.5*"/>
                                <RowDefinition Height="1*"/>
                                <RowDefinition Height="1*"/>
                                <RowDefinition Height="0.5*"/>
                            </Grid.RowDefinitions>
                            <TextBlock Text="{Binding Titre}" 
                                   FontSize="20" FontWeight="Bold"  />
                            <TextBlock Text="{Binding SousTitre}" Grid.Row="1" Name="st"
                                   FontStyle="Italic" Foreground="Gray"/>
                            <TextBlock Text="{Binding Resume}" Grid.Row="2"  TextTrimming="WordEllipsis" Name="r"
                                    Foreground="Gray"/>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Foreground" TargetName="st" Value="White" />
                            <Setter Property="Foreground" TargetName="r" Value="White" />
                            <Setter Property="Background" TargetName="ContentBorder"  Value="DeepSkyBlue" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    and then I removed DataTemplate from the ListView XAML:

    <ListView  x:Name="lvResultat"  Grid.Row="0" Grid.Column="1" Background="{x:Null}"  
               Margin="4"                       
               HorizontalContentAlignment="Stretch"
               ScrollViewer.VerticalScrollBarVisibility="Auto"
               ScrollViewer.HorizontalScrollBarVisibility="Disabled"
               IsSynchronizedWithCurrentItem="True"    
               ItemsSource="{Binding ResultatsRecherche}" SelectedItem="{Binding ResultatSelectione, Mode=TwoWay}" BorderBrush="{x:Null}" >
    </ListView>
    

    However, if you must use DateTemplate, then what you could do is have a property called IsSelected on your ViewModel, ResultatRechercheViewModel and then have DataTriggers on that property in your DataTemplate.

    Updated DataTemplate:

    <ListView.ItemTemplate>
        <DataTemplate DataType="viewModel:ResultatRechercheViewModel">
            <Grid Height="86" Margin="2"  >
                <Grid.RowDefinitions>
                    <RowDefinition Height="1.5*"/>
                    <RowDefinition Height="1*"/>
                    <RowDefinition Height="1*"/>
                    <RowDefinition Height="0.5*"/>
                </Grid.RowDefinitions>
                <TextBlock Text="{Binding Titre}" 
                               FontSize="20" FontWeight="Bold"  />
                <TextBlock Text="{Binding SousTitre}" Grid.Row="1"  Name="st"
                               FontStyle="Italic" Foreground="Gray"/>
                <TextBlock Text="{Binding Resume}" Grid.Row="2"  TextTrimming="WordEllipsis" Name="r"
                                Foreground="Gray"/>
    
            </Grid>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding IsSelected}" Value="True">
                    <Setter Property="Foreground" TargetName="st" Value="White" />
                    <Setter Property="Foreground" TargetName="r" Value="White" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ListView.ItemTemplate>
    

    And, you need to update your ViewModel code to set IsSelected property, Below is code from my MainViewModel:

    public ResultatRechercheViewModel ResultatSelectione
    {
        get { return _resultatSelectione; }
        set
        {
            if (_resultatSelectione != null)
            {
                _resultatSelectione.IsSelected = false;
            }
    
            _resultatSelectione = value;
    
            _resultatSelectione.IsSelected = true;
        }
    }
    

    Hope this resolves your problem or gives you some ideas to resolve your problem.

    0 讨论(0)
  • 2021-01-16 00:13

    Foreground Try use style for listView items:

     <Style TargetType="{x:Type ListViewItem}">
          <Style.Triggers>
               <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Foreground" Value="White"/>
               </Trigger>
           </Style.Triggers>
     </Style>
    
    0 讨论(0)
  • 2021-01-16 00:15

    Try this syntax

    <ListView>
        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                         <Setter Property="Foreground" Value="White"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListView.ItemContainerStyle>
        ...
    </ListView>
    
    0 讨论(0)
提交回复
热议问题