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:
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.
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.
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.
Si vous supprimez votre répertoire vin et vos répertoires subversion, cela rendra le zip un peu plus petit :-) –
Désolé, répertoire bin. –
J'ai ré-uploadé le fichier sans les répertoires svn et bin, merci pour le conseil. maintenant c'est environ 900KB –