绑定到集合的最后 N 个元素

Bind to last N elements of a collection

我使用 wpf 工具包图表显示存储在 ObservableCollection 中的一些数据。当该集合中存储的项目超过 N 时,仅应显示最后 N 项(我无法删除任何项目)。

XAML

<chartingToolkit:LineSeries DependentValueBinding="{Binding DoubleValue,Converter={StaticResource DoubleValueConverter}}" IndependentValueBinding="{Binding Count}" ItemsSource="{Binding Converter={StaticResource DataSourceConverter}}"/>

DataSourceConverter

public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        ICollection<object> items = value as ICollection<object>;

        int N = 300;

        if (items != null)
        {
            return items.Skip(Math.Max(0, items.Count - N)).Take(N);
        }
        else
        {
            return value;
        }  
    }

ItemSource 绑定到包含 "DoubleValue" 和 "Count" 的 ObservableCollection。似乎 DataSourceConverter 只被调用一次,而不是在我的 ObservableCollection 更新时被调用。

忘掉转换器,在你的视图模型 class 中创建一个新的 属性,其中 returns 最后 300 个项目(就像你现在在你的转换器中声明它一样),并绑定到那个。

您可以使用 ICollectionView 并在其上设置过滤器。

从您的 ObservableCollection,创建一个新的 CollectionView:

CollectionView topNItems = (CollectionView) CollectionViewSource.GetDefaultView(myObservableCollection);

接下来,在您的 CollectionView 上创建过滤器:

topNItems.Filter += new FilterEventHandler(ShowOnlyTopNItems);

最后是过滤事件:

private void ShowOnlyBargainsFilter(object sender, FilterEventArgs e)
{
    int n = 300;
    int listCount = myObservableCollection.Count;
    int indexOfItem = myObservableCollection.IndexOf(e.Item);
    e.Accepted = (listCount - indexOfItem) < n;
}

现在,将您的图表绑定到新的 topNItems 而不是 ObservableCollection。