如何在WPF绑定集合中显示前3项?

时间:2013-02-04 19:15:38

标签: wpf

我正在创建一个显示数据摘要的控件。在这个页面上,我将控件绑定到包含许多项的ObservableColection。我创建了一个CollectionView,按时间对项目进行排序,但在此控件中我只想显示前3项。我尝试创建一个转换器来完成此操作,但我尝试过滤列表的所有方法都返回一个“新”列表,并且当一个新项目添加到主ObservableCollection时,控件不再更新。

有没有一种干净的方法来实现这一目标?我将不得不为我的几个系列做类似的事情,所以我想做一些通用的东西。

2 个答案:

答案 0 :(得分:2)

如果您正在使用ViewModel模式, 清理方式 将是另一个具有前N个项目的ObservableCollection。这样,绑定就是直接的,只需更改模型就可以将3改为任何你想要的N.

public class MyViewModel
{
    private ObservableCollection<string> myList;

    public ObservableCollection<string> MyList 
    { 
        get { return myList; }
        set { return myList; }
    }

    public Collection<string> MyListTop3 
    {
        get { return new Collection<string>(MyList.Take(3).ToList()); }
    }

    public MyViewModel() 
    {
        myList = new ObservableCollection<string>();

        myList.CollectionChanged += (sender, args) =>
        { 
            RaisePropertyChanged("MyListTop3");
        }; 
    } 
}

如果您只想通过XAML(没有 cleaneast方式 )来照顾它:

<ListBox>

    <ListBox.Resources>
        <ContentPresenter x:Key="value0" Content="{Binding MyList[0]}"/>
        <ContentPresenter x:Key="value1" Content="{Binding MyList[1]}"/>
        <ContentPresenter x:Key="value2" Content="{Binding MyList[2]}"/>
    </ListBox.Resources>

    <ListBoxItem Content="{DynamicResource value0}"/>
    <ListBoxItem Content="{DynamicResource value1}"/>
    <ListBoxItem Content="{DynamicResource value2}"/>

</ListBox>

此示例显示 ListBox ,但您可以在任何其他控件上使用它。

答案 1 :(得分:1)

您可以使用CollectionView的内置过滤来执行此操作。在Filter谓词中,您可以使用原始集合,并按照与视图排序相同的方式对其进行排序,并检查索引。

FilteredList = new ObservableCollection<string> { "One", "Two", "Three", "Four", "Five" };

_defaultView = CollectionViewSource.GetDefaultView(FilteredList);
_defaultView.SortDescriptions.Add(new System.ComponentModel.SortDescription(".", System.ComponentModel.ListSortDirection.Ascending));
_defaultView.Filter = o =>
{
    int index = FilteredList.OrderBy(s => s).ToList().IndexOf(o as string);
    return index >= 0 && index < 3;
};

您还需要确保在项目添加时随时刷新视图 - 通过将其包含在添加的代码中或者在CollectionChanged事件的处理程序中包含它。

FilteredList.Add(newItem);
_defaultView.Refresh();