我正在创建一个显示数据摘要的控件。在这个页面上,我将控件绑定到包含许多项的ObservableColection。我创建了一个CollectionView,按时间对项目进行排序,但在此控件中我只想显示前3项。我尝试创建一个转换器来完成此操作,但我尝试过滤列表的所有方法都返回一个“新”列表,并且当一个新项目添加到主ObservableCollection时,控件不再更新。
有没有一种干净的方法来实现这一目标?我将不得不为我的几个系列做类似的事情,所以我想做一些通用的东西。
答案 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();