2016-07-27 22 views
1

Ich habe Code wie diese:Warum ist die Verwendung von UserControl in DataTemplate langsamer als direktes XAML?

<ListBox ItemsSource="{Binding Items}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate DataType="{x:Type local:MyViewModel}"> 

      <!-- xaml is typed here directly --> 
      <Border> 
       ... 
      </Border> 

     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Und XAML in der Datatemplate groß ist (mehr als 200 Zeilen).

Ich möchte xaml, das sich in der DataTemplate befindet, in ein separates UserControl verschieben, um die Bearbeitung und Pflege zu vereinfachen. Ich als nächstes tun:

<ListBox ItemsSource="{Binding Items}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate DataType="{x:Type local:MyViewModel}"> 

      <!-- xaml is moved to separate UserControl --> 
      <local:MyViewModelUserControl /> 

     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Das Problem, das ich in laufen, ist, dass Rendering/Verarbeitung des zweiten Codes (mit Usercontrol) etwa 2-mal länger als der erste Code nimmt. Irgendwelche Ideen, wie man damit umgeht?

HINWEIS: Ich verschiebe nicht die ListBox, aber die XAML, die in der DataTemplate ist. Der Grund ist nicht, diesen Code wiederzuverwenden, sondern die Hauptdatei zu minimieren, in der die ListBox platziert ist. Andere Sache ist, dass ich mehrere DataTemplates innerhalb der ListBox habe (für mehrere ViewModels) und die XAML ist wirklich riesig. Deshalb möchte ich dieses XAML (das sich in der DataTemplate befindet) in ein separates Steuerelement verschieben.

Antwort

1

Meiner Meinung nach besteht keine Notwendigkeit, die Listbox ab sofort in ein separates UserControl zu trennen, wenn Sie diese ListBox nur an einer Stelle verwenden. Wenn Sie so sehr daran interessiert sind, Ihren Code zu optimieren und wiederverwendbare Steuerelemente zu erstellen, können Sie eine separate UserControl erstellen. Aber Sie können kein Viewmodel für eine wiederverwendbare Benutzersteuerung haben, da es sich um eine View-basierte Sache handelt.

Sie müssen die erforderlichen Eigenschaften der Listbox an Dependency Properties binden und dann die UserControl erstellen. Indem Sie dies tun, verletzen Sie nicht das MVVM-Muster, und Sie stellen das Steuerelement anderen zur Wiederverwendung zur Verfügung.

Die Verzögerung verursacht nicht aufgrund, was Sie getan haben. Dies liegt wahrscheinlich an der Zeit für das Abrufen von Daten oder an einem anderen Prozess, der dazu führt, dass die Anwendung verzögert wird.

+0

Ich verschiebe nicht die ListBox, aber die XAML, die in der DataTemplate ist. Der Grund besteht nicht darin, diesen Code wiederzuverwenden, sondern ihn in der Hauptdatei zu minimieren, in der die ListBox platziert ist. Andere Sache ist, dass ich mehrere DataTemplates innerhalb der ListBox habe (für mehrere ViewModels) und die XAML ist wirklich riesig. Deshalb möchte ich dieses Xaml (das in der DataTemplate enthalten ist) in ein separates Steuerelement verschieben. Ich habe diese Information zur Antwort hinzugefügt. Entschuldigung, wenn ich den Fall nicht klar beschrieben habe. – Sergey

+0

Das Definieren von Datenvorlagen in einer separaten Datei ist jedoch nicht so gut für eine bessere Wartbarkeit und Lesbarkeit. Eine Liste hat ihre eigenen Datamaplates oder Datatemplates. Es ist kein Problem. Wenn Sie ein wiederverwendbares Listensteuerelement erstellen, ist es in Ordnung. Aber das Verschieben des Datenträgers in eine separate Datei klingt nicht so gut. – ViVi

+0

Ich habe ein Benutzersteuerelement, das ein Element (eines ViewModel) anzeigt und das Verhalten dieses Elements enthält. Ich habe dieses Steuerelement in die ListBox.ItemTemplate eingefügt. Das können Sie im zweiten Code der Frage sehen. Und es scheint, dass die Verwendung von UserControl in ItemTemplate der ListBox langsamer ist als das Schreiben desselben xaml direkt in ListBox.ItemTemplate (Sie können es im 1. Code oben sehen). Das ist das Problem. – Sergey