我有一个显示项目列表的程序,每个项目都有一些额外的细节,可以通过按钮显示和隐藏。源集合是一个名为ObservableCollectionWithRange的自定义类,它只是ObservableCollection的一个简单扩展,允许您批量添加对象(我相信我从这里的某个地方得到它但不记得)。这是代码:
public class ObservableCollectionWithRange<T> : ObservableCollection<T>
{
public void AddRange(IEnumerable<T> items)
{
this.CheckReentrancy();
foreach (var item in items)
this.Items.Add(item);
this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
public void RemoveRange(IEnumerable<T> items)
{
this.CheckReentrancy();
foreach (var item in items)
this.Items.Remove(item);
this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
我的程序还使用分页加载这些项目(加载前10个,如果用户向下滚动足够远,则加载下10个,等等)。现在这是一个奇怪的错误。如果我进行初始搜索并显示第一组结果,我可以显示其他详细信息,一切看起来都很好。但是,如果我折叠细节,然后滚动到底部,以便加载下一组,然后重新展开相同的项目,细节只是空白。
以下是它应该看起来像什么以及第一次看起来像什么:
以下是展开,关闭,然后加载下一组后的样子:
(我知道它们是不同的对象,它们来自不同的搜索,但它确实发生在相同的对象上。)
最奇怪的是我检查了代码并且对象仍然存在,详细信息中显示的对象列表仍然存在,并且所有属性都是正确的。它还为每个细节项创建了一个ListViewItem,这就是为什么它是一个高大的白色空间而不是一个薄的空间,只是它应该显示的数据是空白的。
我确实为ListView和ListViewItem应用了一些自定义样式,但我尝试删除它们并且它们是相同的(当然除了样式)。
现在这里是踢球者。我改为一次添加一个项目,而不是使用&#39; AddRange&#39;能力......并且它正常工作。由于我不是一次性添加很多项目,这对我来说可能是一个可行的解决方案,但它让我非常想知道世界上是什么导致了这种行为,我想了解它
以下是显示详细信息的控件的相关代码:
<StackPanel Visibility="{Binding ShowParameters, Converter={StaticResource BoolToVis}}">
<TextBlock Text="Dimensions" Style="{StaticResource st_SearchTitles}" />
<ListView ItemsSource="{Binding DimensionParameters}" Style="{StaticResource st_ListViewNoScroll}"
ItemContainerStyle="{StaticResource st_ListViewNoSelection}">
<ListView.View>
<GridView ColumnHeaderContainerStyle="{StaticResource st_ColumnHeaderBlank}">
<GridViewColumn DisplayMemberBinding="{Binding Definition.Name}" />
<GridViewColumn DisplayMemberBinding="{Binding Value}" />
</GridView>
</ListView.View>
</ListView>
<TextBlock Text="Classifications" Style="{StaticResource st_SearchTitles}" />
<ListView ItemsSource="{Binding ClassificationParameters}" Style="{StaticResource st_ListViewNoScroll}"
ItemContainerStyle="{StaticResource st_ListViewNoSelection}">
<ListView.View>
<GridView ColumnHeaderContainerStyle="{StaticResource st_ColumnHeaderBlank}">
<GridViewColumn DisplayMemberBinding="{Binding Definition.Name}" />
<GridViewColumn DisplayMemberBinding="{Binding Value}" />
</GridView>
</ListView.View>
</ListView>
<TextBlock Text="Properties" Style="{StaticResource st_SearchTitles}" />
<ListView ItemsSource="{Binding PropertyParameters}" Style="{StaticResource st_ListViewNoScroll}"
ItemContainerStyle="{StaticResource st_ListViewNoSelection}">
<ListView.View>
<GridView ColumnHeaderContainerStyle="{StaticResource st_ColumnHeaderBlank}">
<GridViewColumn DisplayMemberBinding="{Binding Definition.Name}" />
<GridViewColumn DisplayMemberBinding="{Binding Value}" />
</GridView>
</ListView.View>
</ListView>
<TextBlock Text="Formulas" Style="{StaticResource st_SearchTitles}" />
<ListView ItemsSource="{Binding FormulaParameters}" Style="{StaticResource st_ListViewNoScroll}"
ItemContainerStyle="{StaticResource st_ListViewNoSelection}">
<ListView.View>
<GridView ColumnHeaderContainerStyle="{StaticResource st_ColumnHeaderBlank}">
<GridViewColumn DisplayMemberBinding="{Binding Definition.Name}" />
<GridViewColumn DisplayMemberBinding="{Binding Formula}" />
</GridView>
</ListView.View>
</ListView>
<TextBlock Text="Links" Style="{StaticResource st_SearchTitles}" />
<ListView ItemsSource="{Binding UrlParameters}" Style="{StaticResource st_ListViewNoScroll}"
ItemContainerStyle="{StaticResource st_ListViewNoSelection}">
<ListView.View>
<GridView ColumnHeaderContainerStyle="{StaticResource st_ColumnHeaderBlank}">
<GridViewColumn DisplayMemberBinding="{Binding Definition.Name}" />
<GridViewColumn DisplayMemberBinding="{Binding Value}" />
</GridView>
</ListView.View>
</ListView>
<Button Style="{StaticResource st_ToolButton}" Padding="0" HorizontalAlignment="Stretch" Name="btn_Collapse">
<Image Source="../Images/Glyph_Contract.png" Stretch="None">
<Image.Style>
<Style TargetType="Image">
<Style.Triggers>
<DataTrigger Binding="{Binding ShowParameters}" Value="False">
<Setter Property="LayoutTransform">
<Setter.Value>
<RotateTransform Angle="45" />
</Setter.Value>
</Setter>
<Setter Property="Margin" Value="0,-5,0,0" />
</DataTrigger>
<DataTrigger Binding="{Binding ShowParameters}" Value="True">
<Setter Property="LayoutTransform">
<Setter.Value>
<RotateTransform Angle="-135" />
</Setter.Value>
</Setter>
<Setter Property="Margin" Value="0,0,0,-5" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Button>
</StackPanel>
正如您所看到的,细节只是一个包含少量ListView的堆栈面板,以及基于&#39; ShowParameters&#39;视图模型中的布尔参数。有一个按钮显示它,但它只是切换该属性。列表视图的ItemsSource只是CollectionViewSource对象,具有基于公共集合的不同过滤器。
有谁知道这里发生了什么和/或如何使AddRange正常工作?