WPF Set ListViewItem.Background with binding
I have a ListView in grid mode in which I am displaying a list of data. The grid works, but I can't bind the Background property. If "FileExists == false" then I want to display the line in red. Why doesn't it work?
The list is loaded into Windows.Loaded. I also added the [ImplementPropertyChanged] attribute to the data class (using NuGet PropertyChanged.Fody), but that didn't help.
<ListView x:Name="VideosView" TabIndex="2" SelectedValuePath="VideoId" Margin="10,50,10,37" ButtonBase.Click="VideosView_ColumnHeaderClick">
<ListView.Resources>
<Style TargetType="{x:Type ListViewItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding FileExists}" Value="False">
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.Resources>
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Artist, Mode=OneWay}" Header="Artist" Width="100"/>
<GridViewColumn DisplayMemberBinding="{Binding Title, Mode=OneWay}" Header="Title" Width="300"/>
<GridViewColumn DisplayMemberBinding="{Binding Length, Converter={StaticResource TimeSpanConverter}, Mode=OneWay}" Header="Length" Width="40"/>
</GridView>
</ListView.View>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="Control.MouseDoubleClick" Handler="VideosView_ItemDoubleClick"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
Data class
[ImplementPropertyChanged]
public class VideoListItem {
public VideoListItem() {
}
public int VideoId { get; set; }
public string Artist { get; set; }
public string Title { get; set; }
public string FileName { get; set; }
public int? Length { get; set; }
public bool FileExists { get; set; }
public bool IsInDatabase { get; set; }
}
+3
source to share
1 answer
Your default ListViewItem style in ListView resources is not efficient because you explicitly set a different ListViewItem style using the property ItemContainerStyle
.
Just drop the default styling and move the DataTrigger to the ItemContainerStyle:
<ListView ...>
...
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="Control.MouseDoubleClick" Handler="VideosView_ItemDoubleClick"/>
<Style.Triggers>
<DataTrigger Binding="{Binding FileExists}" Value="False">
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
</ListView>
+2
source to share