限制WPF ListView中显示的项目数

时间:2016-08-18 10:06:40

标签: c# wpf listview observablecollection

所以我有一个由ListView支持的ObservableCollection<>控件,它会定期添加项目。但是我只想显示前10个项目;即如果最多有10个项目则显示全部,同时调整大小,如果超过10个则停止在第10个项目显示它们。

我想知道是否有合理的方法来做到这一点,因为我目前的直觉是有第二个集合,它反映了ItemsSource的前10个项目,并相应地进行了更新。

2 个答案:

答案 0 :(得分:1)

你可以做这样的事情(我没有测试过,但你可能会得到这个想法):

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

答案 1 :(得分:1)

我更喜欢为此使用转换器,而不是添加新的模型值或其他额外的集合,因为这经常会影响更改跟踪。

以下过滤器将列表设置为固定大小10:

<ItemsControl ItemsSource="{Binding Configuration.RecentDocuments,Converter={StaticResource ItemSourceCountFilterConverter},ConverterParameter=10}" 

此转换器基本上采用原始IEnumerable并将其过滤到所需的项数并返回:

public  class ItemSourceCountFilterConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var val = value as IEnumerable;
        if (val == null)
            return value;

        int take = 10;
        if (parameter != null)
            int.TryParse(parameter as string, out take);


        if (take < 1)
            return value;
        var list = new List<object>();

        int count = 0;
        foreach (var li in val)
        {
            count++;
            if(count > take)
                break;
            list.Add(li);
        }
        return list;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}