2012-05-31 13 views
5

Ich verwende datatemplate, um meine Ansichten mithilfe der PRISM 4-Erkennung zu laden. Ich muss das view/viewmodel mehrere Male erstellen, anstatt vorhandene Instanzen wiederzuverwenden, sodass ich x: Shared = false in der Ressource festlege, aber es hat nur Auswirkungen auf das Viewmodel. Ich kann bestätigen, dass das Ansichtsmodell nicht wiederverwendet wird, aber die Ansicht ist. Der View-Konstruktor wird nur beim ersten Aufruf aufgerufen. Ich habe ähnliche Beiträge hier gelesen, aber ihre Lösungen haben nicht für mich funktioniert. Ich möchte wissen, ob ich etwas wie die Ressource loader/locator erweitern kann und sicherstellen, dass es das Shared-Flag respektiert.DataTemplate x: Shared = false hat keinen Einfluss auf die Ansicht

Hier ist, wie meine Vorlage definiert ist:

<DataTemplate DataType="{x:Type CVM:MyViewModel}" x:Shared="False"> 
     <V:MyView /> 
</DataTemplate> 
+0

Jede Umgehungslösung, ohne das Design ändern zu müssen? – DotnetEng

+0

Weiß nicht, habe kein Prisma benutzt und kann mir nichts elegantes vorstellen. –

+0

In Prism steuern Sie, ob Sie Singleton oder nicht über das 'PartCreationPolicy' Attribut wollen. 'Shared' = Singleton,' NonShared' = eine neue Instanz. Hast du deine Ansicht mit '[PartCreationPolicy (CreationPolicy.NonShared)]' dekoriert? –

Antwort

0

Alle DataTemplate enthält, ist ein 'Template' für die notwendige Baumstruktur für die Erstellung, wenn das Objekt (in Ihrem Fall das Viewmodel) in Sicht kommt.

Wenn nur einer von Ihnen 'MyViewModel' Objekte in Sicht ist, wird der Konstruktor für Ihre Ansicht nur einmal aufgerufen (auch wenn mehrere Viewmodels instanziiert werden). Wenn Sie mehrere Ihrer Ansichtsmodelle im Blick hatten, wird der Konstruktor für Ihre Ansicht mehrmals aufgerufen, da die Vorlage Ihrer DataTemplate ordnungsgemäß erstellt und dem Visual Tree hinzugefügt wird (einmal für jedes ViewModel).

Wenn jedoch Ihre ItemsControl (die Ihre Viewmodels enthält) die Virtualisierung eingeschaltet hat, dann kann nur ein "Container" (der vereinfacht Ihre Datatemplate sein wird) existieren und kann wiederverwendet werden.