我使用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
被更新。
答案 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。