Wpf 将AlternationIndex与样式中的可见性相结合

Wpf 将AlternationIndex与样式中的可见性相结合,wpf,xaml,styles,itemscontrol,Wpf,Xaml,Styles,Itemscontrol,以下是一种样式,当绑定到属性ALIVE=false的记录时隐藏ListViewItem,然后基于AlternationalIndex设置相同ListViewItem背景的颜色: 目的是: 首先,隐藏所有活动设置为false的记录 然后,对其余行应用交替背景色。 实际发生的情况: 将隐藏活动设置为false的记录 交替背景应用于所有行,从而打破交替 效果:你可能会得到黄色/黄色/白色/黄色,而不是黄色/白色/白色 现在的问题是: 是否可以通过告诉AlternationIndex跳过应该隐藏的行来控

以下是一种样式,当绑定到属性ALIVE=false的记录时隐藏ListViewItem,然后基于AlternationalIndex设置相同ListViewItem背景的颜色:

目的是:

首先,隐藏所有活动设置为false的记录 然后,对其余行应用交替背景色。 实际发生的情况:

将隐藏活动设置为false的记录 交替背景应用于所有行,从而打破交替 效果:你可能会得到黄色/黄色/白色/黄色,而不是黄色/白色/白色 现在的问题是:

是否可以通过告诉AlternationIndex跳过应该隐藏的行来控制AlternationIndex

我不喜欢的一个选择:


与其用样式隐藏行,不如从绑定到ListView的基础集合中筛选出不活动的行。

在集合的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。

集合属性的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。

我同意最简单的方法是在绑定之前过滤数据源。但是,如果您无法学习该课程,您可以使用ObjectDataProvider和CollectionViewSource以及交替行颜色的样式在XAML中过滤数据源。请参见此处的过滤示例:

我同意最直接的方法是在绑定之前过滤数据源。但是,如果您无法学习该课程,您可以使用ObjectDataProvider和CollectionViewSource以及交替行颜色的样式在XAML中过滤数据源。请看这里的过滤示例:

据我所知,在使用变更索引时,隐藏项仍然有效,这就是为什么变更颜色看起来像随机的,但实际上不是。我认为,像你提到的那样,在这里使用源代码集合比发明与UI相关的解决方案更容易。据我所知,在使用变更索引时,隐藏项仍然很重要,这就是为什么变更颜色看起来像随机的,但实际上不是随机的。我认为像你提到的那样,在这里使用源代码集合比发明与UI相关的解决方案更容易。