2009-10-07 5 views
0

J'ai un TDI lié à une collection observable d'espaces de travail (tous basés sur la MVVM Demo de Josh Smith). Sur un onglet, il y a un contrôle utilisateur, également lié à une collection observable. Si je change d'onglet, le contrôle utilisateur revient toujours au 1er élément.Pourquoi mon contrôle ObservableCollection passe-t-il au 1er élément?

Je suis un peu désespérée. J'ai cherché depuis 5 heures maintenant mais juste je ne peux pas comprendre pourquoi cela fait ceci ou où chercher.

I simplifié le tout autant que je pouvais et téléchargé sur: http://mad-scientists.co.uk/share/TestCandiMan.zip (environ 1,5MB)

Votre aide est grandement appréciée!

J'utilise C# Express 2008.

+0

Si vous supprimez votre répertoire vin et vos répertoires subversion, cela rendra le zip un peu plus petit :-) –

+0

Désolé, répertoire bin. –

+0

J'ai ré-uploadé le fichier sans les répertoires svn et bin, merci pour le conseil. maintenant c'est environ 900KB –

Répondre

1

Le problème ici est que le TabControl instantiaties une nouvelle DataTemplate pour son contenu chaque fois que vous sélectionnez un autre élément de l'onglet, de sorte que votre vue est recréée avec tout fixe par défaut. Vous devez implémenter un mécanisme pour avoir une vue unique pour un modèle de vue donné. Sans MVVM, vous ajouteriez simplement une propriété View au ViewModel, mais cela va à l'encontre du but de MVVM ici. Ce que je voulais dire c'est que chaque fois que vous changez d'onglet, le TabControl affiche son contenu en utilisant une nouvelle arborescence visuelle du DataTemplate.

Prenons un exemple:

  1. Vous sélectionnez l'onglet # 1, son contenu est un CustomerViewModel. Un nouvel arbre visuel (à partir de votre NewCustomerView) est créé à partir du DataTemplate et affiché sur le TabControl. Le signe d'insertion est dans la première zone de texte, l'onglet a son premier index sélectionné, etc.

  2. Vous sélectionnez l'onglet n ° 2. Le contenu de l'onglet # 1 n'est plus dans l'arborescence visuelle et est ignoré. Le contenu de l'onglet n ° 2 suivra le même processus que celui utilisé pour construire un arbre.

  3. Vous sélectionnez à nouveau l'onglet n ° 1. Le contenu de l'onglet n ° 2 n'est plus dans l'arborescence visuelle et est ignoré. Et ici, le même mécanisme s'active à nouveau. Un nouvel arbre visuel est créé à partir du DataTemplate, avec tout ce qu'il a par défaut. Woops! Mais c'est normal puisque le ContentPresenter de WPF ne conserve pas l'arborescence d'un contenu en mémoire pour tous les objets possibles qui ont été son contenu une fois.

=> La solution théorique, construisez vous-même votre visuel. Par exemple, dans un monde totalement imparfait, crée un NewCustomerView unique dans votre CustomViewModel et l'expose via une propriété, par exemple View. Le nouveau DataTemplate que vous utiliserez sera:

<DataTemplate DataType="{x:Type CustomerViewModel}"> 
    <ContentPresenter Content="{Binding View}" /> 
</DataTemplate> 

Et le tour est joué, quand un arbre visuel est créé à partir du modèle, le présentateur sera totalement nouveau, mais la vue est unique et ne sera pas recréé afin que le curseur soit au même endroit que l'utilisateur l'a laissé, même chose pour les onglets. Mais, comme je l'ai déjà dit, cela ne va pas du tout avec la philosophie de MVVM. Essayez de créer une classe statique capable de renvoyer une vue unique pour un ViewModel donné, ou quelque chose comme ça.

Une autre solution sera d'ajouter à votre ViewModel des choses comme SelectedTabIndex et de les lier, CurrentFocusPosition et autres, mais c'est totalement lié à la vue.

+0

hmmm ... cela signifie que je ne peux pas utiliser le même DataTemplate (par exemple les données de base du client) pour afficher et créer en même temps dans ce scénario? C'est trop mauvais, car cela signifie une redondance –

+0

Je pense que je vous ai mal compris, parce que je viens d'ajouter la fonction pour ajouter un onglet vide. Même si cela n'a rien à voir avec la vue des clients existants et le modèle de données, l'onglet client revient à l'élément n ° 1 comme avant ... –

+0

Mise à jour de ma réponse suite à vos commentaires. –

Questions connexes