绑定到集合的N个元素

时间:2015-02-12 13:44:21

标签: c# wpf data-binding

我使用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绑定到ObservableCollection,其中包含&#34; DoubleValue&#34;和&#34;伯爵&#34;。似乎DataSourceConverter只被调用一次而不是我的ObservableCollection被更新。

2 个答案:

答案 0 :(得分:4)

忘记转换器,在viewmodel类中创建一个新属性,它返回最后300个项目(就像你现在在转换器中声明它一样),然后绑定到它。

答案 1 :(得分:1)

您可以使用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;
}

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