2014-09-01 4 views
3

У меня есть ListView в режиме сетки, в котором я отображаю список данных. Сетка работает, но я не могу связать свойство Background. Если «FileExists == false», то я хочу отобразить строку красным цветом. Почему это не работает?WPF Set ListViewItem.Background With Binding

Список загружается в 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> 

класс данных

[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

Почему у вас есть два ListViewItem стилей, один стиль по умолчанию в ListView в ресурсах, а еще один набор, как ItemContainerStyle? Просто переместите DataTrigger в ItemContainerStyle и оставьте другой стиль. – Clemens

+0

у вас есть 2 стиля для ItemContainerStyle, 1 в ваших ресурсах, которые вы не нам, и кажется, что это тот, который вы не хотите окрашивать, и еще один набор как itemsContainerStyle, который кажется, что он ничего не делает, так что конкретно ru пытаясь сделать? –

ответ

2

Ваш ListViewItem по умолчанию стиль в ресурсах в ListView не является эффективным, поскольку вы явно установить другой 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> 
+0

mmm ... Я тоже это пробовал, но, возможно, была еще одна деталь, которую я оставил не так, когда попробовал. Теперь я снова пытаюсь это сделать, и он работает. Ну, что ж, спасибо! –