2010-07-02 8 views
1

J'ai une vue (MainView) qui contient une sorte de zone de contenu principal (MainContent). La vue est soutenue par un ViewModel correspondant (MainViewModel). Le contenu principal change, bien sûr, en fonction de l'état actuel de l'application et est représenté dans le ViewModel en tant que propriété (CurrentPrimaryViewModel). Le contenu de Maincontent est lié à CurrentPrimaryViewModel dans le XAML comme ceci:WPF, WVVM, Liaison de données et ResourceDictionaries

Content="{Binding Path=CurrentPrimaryViewModel}" 

Il y a un ResourceDictionary contenant un groupe de ViewModel-> Voir DataTemplates de cartographie. Donc, si CurrentPrimaryViewModel est de type XViewModel, il se résout en XView.

Tout cela fonctionne, en quelque sorte.

Le problème est que chaque fois que CurrentPrimaryViewModel change une nouvelle vue est créée. Ce que je voudrais, c'est que View soit mappé de manière appropriée pour que DataContext soit changé en ViewModel correct et que cette View devienne MainContent. Fondamentalement, comme le CardStack? layout à partir de Java, ou un TabControl sans les onglets visibles.

Quelle est la technique appropriée pour gérer cette situation? Dois-je simplement créer les différentes vues sous l'enveloppe MainContent et basculer leur visibilité ou Z-Order? Y a-t-il un bon schéma pour cela? Qu'est-ce qui devrait être lié entre MainView et MainViewModel pour accomplir ceci?

Répondre

0

AFAIK il n'y a aucun contrôle qui peut le faire. Cependant, il me semble que ce serait spectaculairement facile à faire (l'ignorance est un bonheur, vous savez). Tout ce que vous devez faire est de créer un DataTemplateSelector personnalisé qui mettrait en cache les modèles pour vos ContentControls.

+0

N'aurais-je pas besoin de créer un DataTemplateSelector personnalisé pour chaque instance de MainContent qui connaît les différents DataTemplates disponibles. Je viens d'écrire un petit SelectorPanel avec une propriété de dépendance CurrentItemKey et une propriété attachée ItemKey. Le SelectorPanel ne fait que passer en boucle dans les contrôles enfants et bascule leur visibilité en fonction de si ItemKey correspond à CurrentItemKey. C'est brut, mais ça marche. – od9

+0

@ od9 un datatemplate est apparié à un type. Il vous suffit donc de créer un DataTemplateSelector unique en tant que ressource et de l'utiliser partout où vous devez partager des instances de modèle. Au sein du DTS, vous devez simplement conserver un dictionnaire d'instances de type/modèle et les ajouter ou les envoyer. – Will