WPF 设置 ListViewItem.Background 与绑定

Eti*_*and 5 c# wpf binding

我有一个网格模式的 ListView,我在其中显示数据列表。网格有效,但我无法绑定 Background 属性。如果“FileExists == false”,那么我想以红色显示该行。为什么这不起作用?

该列表在 Windows.Loaded 中加载。我还将 [ImplementPropertyChanged] 属性添加到数据类(使用 NuGet PropertyChanged.Fody),但这没有帮助。

<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>
Run Code Online (Sandbox Code Playgroud)

数据类

[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; }
}
Run Code Online (Sandbox Code Playgroud)

Cle*_*ens 4

ListView 资源中的默认 ListViewItem 样式无效,因为您通过属性显式设置了另一个ListViewItem 样式ItemContainerStyle

只需删除默认样式并将 DataTrigger 移至 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>
Run Code Online (Sandbox Code Playgroud)