2017-12-27 7 views
0

ListViewに80以上のアイテムがある新しいビューを読み込んだりレンダリングするときに問題があるUWPアプリケーションを扱っています。私は多くの列(listViewの各項目のプロパティ)を表示する必要があります。私は仮想化について読んだが、このケースでは正しいアプローチであるかどうかはわからない(より大きなデータセットに適しているようだ)。私がやることすべてが、これは私のXAMLコードであるItems = new ObservableCollection<ListModel>(products) のViewModelでObservableCollectionがクラッシュするUWP

を参考にすることができ任意のスタックトレースまたは何もせずにアプリがクラッシュです:

<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から

enter image description here

おかげ

+3

エラー/例外とは何ですか? –

+0

私はobservableCollectionの割り当てがtryとcatchでラップされていても例外ではありません。これは私がコンソールで得るものです スレッド0x57b0がコード0(0x0)で終了しました。 プログラム '[15992]はコード-1073741189(0xc000027b)で終了しました。ラファエルに感謝します。 – marsalal1014

答えて

2

  • グリッドビューはスクロールビューア内にあるため、すべてのアイテムを表示/ロードするために垂直方向に拡張できるため、仮想化のメリットはありません。ビューポートに収まるアイテムが多すぎる場合、GridViewは自動的にスクロールバーを表示します。

この問題は、私が使用していたリストビューが垂直方向に伸びて、すべてのアイテム(その時点で400+)を強制的に強制的に伸ばすことが許可されていたため、同様の「アタッチ・デバッガ」ダイアログでクラッシュさせることができます。だから、最初は、私は仮想化に蹴ることができるようにScrollViewerの外であなたのGridViewを移動するためにそれを試してみた。

  • をGridViewのヘッダーでは、あなたはdoesnのRelativePanel.AlignLeftWith="dataVerified"でその場所を設定しようとしているリストビューを持っていますあなたはそこに相対的なパネルを持っていないので、正しく見えません。

  • 最後に、どのスレッドが初期化してObservableCollectionを設定しているかを確認します。別のスレッドで起きている場合は、UI以外のスレッドからUIプロパティを設定できないため、アプリケーションがクラッシュします。何らかのソースから製品をロードするので、非同期void /タスクでそれをやっている可能性が高いので、コールを整理して(コレクションの初期化とプロパティの設定)、UIスレッドに戻してください。この事がWin32の例外を引き起こすかどうかはわかりませんが、チェックする価値があります。

  • また、これは問題に関連していませんが、バインディングにUpdateSourceTrigger=PropertyChangedは必要ありません。

+0

スクロールビューアは仮想化を邪魔して、そのトリックをしました。 – marsalal1014

関連する問題