代码之家  ›  专栏  ›  技术社区  ›  Jake Conkerton-Darby

限制WPF ListView中显示的项目数

  •  1
  • Jake Conkerton-Darby  · 技术社区  · 8 年前

    所以我有一个 ListView ObservableCollection<> 定期获取添加到其中的项目。然而,我最多只想展示前10项;i、 e.如果最多有10个项目,则显示所有项目,同时相应调整大小,如果超过10个,则在第10个项目处停止显示。

    2 回复  |  直到 8 年前
        1
  •  1
  •   Pikoh qtg    8 年前

    你可以这样做(我还没有测试过,但你可能会明白):

    _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();
    
        2
  •  1
  •   Rick Strahl    6 年前

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

    以下筛选器将列表设置为固定大小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();
        }
    }