C# 可观测收集崩溃UWP

C# 可观测收集崩溃UWP,c#,xaml,uwp,C#,Xaml,Uwp,我一直在处理一个UWP应用程序,它在加载/呈现ListView中有80多个项目的新视图时出现问题。我必须显示很多列(listView中每个项目的属性)。我读过关于虚拟化的文章,但我不确定在这种情况下这是否是正确的方法(似乎更适合于更大的数据集)。应用程序崩溃,没有任何堆栈跟踪或任何有用的东西 在viewModel中,我所做的就是Items=newobservetecollection(products) 这是我的xaml代码: <ScrollViewer HorizontalScrollB

我一直在处理一个UWP应用程序,它在加载/呈现ListView中有80多个项目的新视图时出现问题。我必须显示很多列(listView中每个项目的属性)。我读过关于虚拟化的文章,但我不确定在这种情况下这是否是正确的方法(似乎更适合于更大的数据集)。应用程序崩溃,没有任何堆栈跟踪或任何有用的东西

在viewModel中,我所做的就是
Items=newobservetecollection(products)
这是我的xaml代码:

<ScrollViewer HorizontalScrollBarVisibility="Auto"
                      VerticalScrollBarVisibility="Auto"
                      Grid.Row="1">
            <GridView ItemsSource="{Binding Path=Items, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                      Name="NewItemView"
                      HorizontalAlignment="Stretch"
                      Margin="0,0,0,0"
                      Background="White"
                      Width="{Binding Path=GridWidth, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
                <GridView.Header>
                    <Grid Grid.Row="0"
                          Background="#FF6FC3E8"
                          BorderBrush="White"
                          BorderThickness="1">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="150"></ColumnDefinition>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0"
                                   x:Uid="dataVerifiedSubt"
                                   Width="150"
                                   Style="{StaticResource TextBlockTitleProductsListPage}"
                                   x:Name="dataVerified"></TextBlock>
                        <ListView Grid.Column="1"
                                  Height="100"
                                  VerticalAlignment="Top"
                                  RelativePanel.AlignLeftWith="dataVerified"
                                  SelectionMode="None"
                                  ItemsSource="{Binding Path=ProductFields, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                  IsItemClickEnabled="True">
                            <ListView.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <StackPanel Orientation="Horizontal"/>
                                </ItemsPanelTemplate>
                            </ListView.ItemsPanel>
                            <ListView.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding ProductField.Field_Name}"
                                               Width="150"
                                               Style="{StaticResource TextBlockTitleProductsListPage}"></TextBlock>
                                </DataTemplate>
                            </ListView.ItemTemplate>
                            <interactivity:Interaction.Behaviors>
                                <core:EventTriggerBehavior EventName="ItemClick">
                                    <core:InvokeCommandAction Command="{Binding Path=test}">
                                    </core:InvokeCommandAction>
                                </core:EventTriggerBehavior>
                            </interactivity:Interaction.Behaviors>
                        </ListView>
                    </Grid>
                </GridView.Header>
                <GridView.ItemTemplate>
                    <DataTemplate ScrollViewer.HorizontalScrollBarVisibility="Visible"
                                  ScrollViewer.VerticalScrollBarVisibility="Visible">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="150"></ColumnDefinition>
                                <ColumnDefinition Width="*"></ColumnDefinition>
                            </Grid.ColumnDefinitions>
                            <CheckBox HorizontalAlignment="Right"
                                      VerticalAlignment="Center"
                                      IsChecked="{Binding test1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                            <ListView Grid.Column="1"
                                      VerticalAlignment="Top"
                                      ItemsSource="{Binding ProductFieldValues, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                      Width="{Binding Width,ElementName=NewItemView}"
                                      SelectionMode="None"
                                      Style="{StaticResource ProductListTable}"
                                      Name="ProductFieldValuesList">
                                <ListView.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <StackPanel Orientation="Horizontal"/>
                                    </ItemsPanelTemplate>
                                </ListView.ItemsPanel>
                                <ListView.ItemTemplate>
                                    <DataTemplate>
                                        <Button Command="{Binding Path=DataContext.OpenProductInfo, ElementName=NewItemView}"
                                                CommandParameter="{Binding DataContext.ProductId, ElementName=ProductFieldValuesList}"
                                                Style="{StaticResource ProductListPageTextBlockButton}">
                                            <TextBlock Text="{Binding}" TextWrapping="Wrap"/>
                                        </Button>
                                    </DataTemplate>
                                </ListView.ItemTemplate>
                            </ListView>
                        </Grid>
                    </DataTemplate>
                </GridView.ItemTemplate>
            </GridView>
        </ScrollViewer>

我在坠机后得到了这样的信息:

谢谢你,XAML:

  • 您的GridView不会从虚拟化中受益,因为您的GridView位于scrollviewer中,可以垂直增长以显示/加载所有项目。如果视口中的项目太多,GridView将自动显示滚动条
我之前遇到过这个问题,这是因为虚拟化不起作用,因为我使用的listview被允许垂直延伸出页面边界,迫使它加载所有项目(当时超过400个),这导致应用程序在类似的“附加调试器”对话框中崩溃。所以首先我要尝试将GridView移到ScrollViewer之外,这样虚拟化就可以开始了

  • 在GridView标题中,有一个listview正在尝试使用
    RelativePanel.AlignLeftWith=“dataVerified”
    设置其位置,但它看起来不正确,因为其中没有相对面板

  • 最后一件事是检查哪个线程正在初始化和设置ObservableCollection。如果它发生在不同的线程上,那么应用程序将崩溃,因为您无法从非UI线程设置UI属性。由于您是从某个源加载产品,因此很可能是在异步void/任务中进行的,因此请确保将该调用(初始化集合并设置属性)编组回UI线程。我不确定这是否会导致Win32异常,但值得检查

  • 此外,这与问题无关,但在绑定中不需要
    UpdateSourceTrigger=PropertyChanged

    • 来自您的XAML:

      • 您的GridView不会从虚拟化中受益,因为您的GridView位于scrollviewer中,可以垂直增长以显示/加载所有项目。如果视口中的项目太多,GridView将自动显示滚动条
      我之前遇到过这个问题,这是因为虚拟化不起作用,因为我使用的listview被允许垂直延伸出页面边界,迫使它加载所有项目(当时超过400个),这导致应用程序在类似的“附加调试器”对话框中崩溃。所以首先我要尝试将GridView移到ScrollViewer之外,这样虚拟化就可以开始了

      • 在GridView标题中,有一个listview正在尝试使用
        RelativePanel.AlignLeftWith=“dataVerified”
        设置其位置,但它看起来不正确,因为其中没有相对面板

      • 最后一件事是检查哪个线程正在初始化和设置ObservableCollection。如果它发生在不同的线程上,那么应用程序将崩溃,因为您无法从非UI线程设置UI属性。由于您是从某个源加载产品,因此很可能是在异步void/任务中进行的,因此请确保将该调用(初始化集合并设置属性)编组回UI线程。我不确定这是否会导致Win32异常,但值得检查

      • 此外,这与问题无关,但在绑定中不需要
        UpdateSourceTrigger=PropertyChanged


      什么是错误/异常?没有异常,即使我将observableCollection分配包装在try-and-catch中。这是我在控制台上得到的,线程0x57b0已退出,代码为0(0x0)。程序“[15992]已退出,代码为-1073741189(0xc000027b)。错误/异常是什么?没有异常,即使我将observableCollection分配包装在try and catch中。这是我在控制台上看到的