这是一种样式,当使用属性 ALIVE = false 绑定到记录时隐藏ListViewItem,然后基于a设置相同ListViewItem背景的颜色的 AlternationIndex :
<Style x:Key="alternatingListViewItemStyle" TargetType="{x:Type ListViewItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=ALIVE}" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Background" Value= "LemonChiffon"></Setter>
</Trigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="2">
<Setter Property="Background" Value="White"></Setter>
</Trigger>
</Style.Triggers>
</Style>
意图是:
实际会发生什么:
现在问题:
是否有可能以某种方式控制AlternationIndex(通过告诉它跳过应该隐藏的行)?
一个替代(我不喜欢):
不是隐藏带有样式的行,而是从底层集合中过滤掉不是ALIVE的行(绑定到ListView)
答案 0 :(得分:3)
您的集合属性的getter中的简单LINQ将节省您的时间,而不是面向UI的解决方案..这是它的样子..
private ObservableCollection<YourClass> _allDataItems;
//The entire collection
public ObservableCollection<YourClass> AllDataItems
{
get
{
return _allDataItems;
}
set
{
if( _allDataItems == value ) { return; }
_allDataItems = value;
if( _allDataItems != null )
{
_allDataItems.CollectionChangedEvent += ( s, e ) =>
{
RaisePropertyChanged( "DisplayedDataItems" );
};
}
RaisePropertyChanged( "AllDataItems " );
RaisePropertyChanged( "DisplayedDataItems" );
}
}
//The displayed colelction
public ObservableCollection<YourClass> DisplayedDataItems
{
get
{
return AllDataItems.Where( adi => adi.ALIVE == true );
}
}
您只需将DisplayedDataItems绑定到ListView即可。
答案 1 :(得分:1)
我同意最直接的方法是在绑定之前过滤您的数据源。但是,如果您无法学习该课程,则可以使用ObjectDataProvider和CollectionViewSource与您的样式一起过滤XAML中的数据源以交替行颜色)。请参阅此处的过滤示例:http://www.galasoft.ch/mydotnet/articles/article-2007081301.aspx