在样式中将AlternationIndex与Visibility结合使用

时间:2014-04-23 13:09:05

标签: wpf xaml styles itemscontrol

这是一种样式,当使用属性 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>

意图是:

  1. 首先,隐藏所有ALIVE设置为false的记录
  2. 然后,将交替的背景颜色应用于剩余的行。
  3. 实际会发生什么:

    1. 隐藏ALIVE设置为false的记录
    2. 交替背景应用于 ALL 行,从而打破了交替 效果(例如:不是黄色/ 白色 /黄色/ 白色 ,您可能会得到黄色/黄色/ 白色 /黄
    3. 现在问题

      是否有可能以某种方式控制AlternationIndex(通过告诉它跳过应该隐藏的行)?


      一个替代(我不喜欢):

      不是隐藏带有样式的行,而是从底层集合中过滤掉不是ALIVE的行(绑定到ListView)

2 个答案:

答案 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