带范围的ObservableCollection会导致UI出现问题

时间:2017-03-09 19:29:24

标签: c# wpf observablecollection

我有一个显示项目列表的程序,每个项目都有一些额外的细节,可以通过按钮显示和隐藏。源集合是一个名为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个,等等)。现在这是一个奇怪的错误。如果我进行初始搜索并显示第一组结果,我可以显示其他详细信息,一切看起来都很好。但是,如果我折叠细节,然后滚动到底部,以便加载下一组,然后重新展开相同的项目,细节只是空白。

以下是它应该看起来像什么以及第一次看起来像什么:

The correct view

以下是展开,关闭,然后加载下一组后的样子:

enter image description here

(我知道它们是不同的对象,它们来自不同的搜索,但它确实发生在相同的对象上。)

最奇怪的是我检查了代码并且对象仍然存在,详细信息中显示的对象列表仍然存在,并且所有属性都是正确的。它还为每个细节项创建了一个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正常工作?

0 个答案:

没有答案