2012-04-02 5 views
2

Ich habe eine DataGrid mit VirtualizationMode="Recycling", die an eine ObservableCollection in meinem ViewModel gebunden ist. Es funktioniert gut - Scrollen und Seiten hoch/runter ist schnell.Virtualisierung: Gibt es eine Möglichkeit, generierte Container auch aus verschachtelten ItemsControl zu recyceln?

Jetzt füge ich noch einen DataGridTemplateColumn mit einem ItemsControl in seinem DataTemplate hinzu. Es ist an etwa 15 Elemente gebunden (für alle Zeilen die gleiche Anzahl). Jetzt ist das Scrollen viel langsamer. Aber wenn die zugrunde liegende Collection Null ist, ist alles wieder schnell. Ich nehme an, dass die generierten ItemContainer in jeder Zeile nicht wiederverwendet werden.

Gibt es eine Möglichkeit, den gesamten Prozess zu beschleunigen oder noch besser alle verschachtelten Steuerelemente in der Reihe zu recyceln?

PS: Ich würde ein ItemsControl in einer DataGridColumn, nicht eine DataGridColumn für jedes Element in Collection bevorzugen.

+0

Bitte zeigen Sie die Bindung für Ihre ItemsControl – Paparazzi

+0

Ein Hack aber offen legen Sie eine Text-Eigenschaft, die Elemente in MyObservableCollection zu einer Zeichenfolge verkettet. – Paparazzi

+0

kann ich nicht, weil ich separate Bearbeitung, Tab-Navigation, Kontextmenü, alternative Detailansicht statt TextBox und so weiter wollen ... – LPL

Antwort

0

Nach einigen weiteren Recherchen kann ich sagen: Das Problem ist nicht die Erstellung des Containers selbst, sondern der Inhalt des Containers. 15 TextBoxen sind schwerer als ich dachte. Ich habe die TextBox durch TextBlock ersetzt und es war so schnell wie zuvor.

Da ich bearbeiten muss habe ich DataGridTemplateColumn.CellTemplate in DataGridTemplateColumn.CellEditingTemplate geändert und ein neues CellTemplate mit einem TextBlock erstellt. I schalten die Vorlagen mit:

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

so nur die ausgewählte Zelle/Zeile zeigt einen TextBox.

Natürlich habe ich jetzt neue Probleme mit Focusmanagement und Keyboardnavigation. Aber ich denke, ich muss es so machen.

Verwandte Themen