所以我有一个由ListView
支持的ObservableCollection<>
控件,它会定期添加项目。但是我只想显示前10个项目;即如果最多有10个项目则显示全部,同时调整大小,如果超过10个则停止在第10个项目显示它们。
我想知道是否有合理的方法来做到这一点,因为我目前的直觉是有第二个集合,它反映了ItemsSource的前10个项目,并相应地进行了更新。
答案 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();
}
}