绑定到集合的最后 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。
我使用 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。