2012-04-02 27 views
2

DataGridVirtualizationMode="Recycling"があり、ViewModelでObservableCollectionにバインドされています。それはうまく動作します - スクロールとページの上/下が速いです。仮想化:ネストされたItemsControlから生成されたコンテナをリサイクルする方法はありますか?

ここでItemsControlのついたDataGridTemplateColumnDataTemplateに追加します。それは約15項目に束縛されています(すべての行について同じ数)。スクロールはずっと遅いです。しかし、基になるCollectionがNullの場合は、すべてが再び高速です。私は、各行に生成されたItemContainerがリサイクルされないと仮定します。

プロセス全体のスピードを上げる方法や、行内のすべてのネストされたコントロールをリサイクルする方法はありますか?

PS:DataGridColumnではItemsControlを使用しますが、Collectionの各ItemにはDataGridColumnを使用しません。

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <ItemsControl ItemsSource="{Binding AObservableCollection}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Horizontal" /> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <TextBox Text="{Binding AStringProperty}" Width="40" /> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
+0

ItemsControlのバインディングを表示してください – Paparazzi

+0

ハックしますが、MyObservableCollection内のアイテムを文字列に連結するテキストプロパティが公開されています。 – Paparazzi

+0

テキストボックスの代わりに別の編集、タブナビゲーション、コンテキストメニュー、代替詳細ビューなどが必要なので、できません。 – LPL

答えて

0

さらに詳しい調査をした後、私は言うことができます:問題はコンテナ自体の作成ではなく、コンテナの内容です。 15のテキストボックスは重いですね。私は、をTextBlockに置き換えました。以前と同じくらい速くなりました。

編集が必要なのでDataGridTemplateColumn.CellTemplateDataGridTemplateColumn.CellEditingTemplateに変更し、TextBlockで新しいCellTemplateを作成しました。テンプレートを切り替える:

<DataGrid.CellStyle> 
    <Style TargetType="{x:Type DataGridCell}"> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True"> 
       <Setter Property="IsEditing" Value="True" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.CellStyle> 

したがって、選択したセル/行だけがTextBoxと表示されます。

もちろん、私はFocusmanagementとKeyboardnavigationに新しい問題があります。しかし、私はこのようにしなければならないと思います。

関連する問題