2011-08-01 1 views
3

J'ai une grille de données dans mon application MVVM qui, en raison de la manière dont le client souhaite que les données soient affichées, utilise des colonnes de modèle. Ils veulent cependant une fonctionnalité d'entrée de données typique (appuyer sur Entrée pour vérifier les données, valider la ligne si elle est valide, se concentrer sur la première zone de texte de la ligne suivante et appuyer sur Tab pour mettre en surbrillance la zone de texte suivante ...). En outre, les données sont souvent importées d'une source externe dans la grille, généralement des milliers d'enregistrements à la fois.Problème de saisie de données de données MVVM WPF

À l'heure actuelle, j'ai un événement Loaded connecté à chaque zone de texte que j'utilise pour définir le focus après l'ajout de nouvelles lignes. Mon problème est que la grille se détraque quand j'importe beaucoup de lignes. Lorsque l'utilisateur défile, les événements Loaded sont déclenchés et la grille devient fondamentalement inutilisable. J'ai désactivé la virtualisation pour éviter cela, et j'ai trouvé que ma grille prenait un gig de RAM dans certaines configurations, ce qui est inacceptable. Je n'arrive pas à trouver un moyen de faire en sorte que cette grille fonctionne comme ils le souhaitent sans utiliser une énorme quantité de mémoire. Il semble que je doive juste pouvoir focaliser une zone de texte dans une ligne nouvellement ajoutée, mais puisque la validation des données est effectuée dans le viewmodel, je n'ai pas accès à la nouvelle ligne dans codebehind, donc je ne peux pas appelez "newtextbox.focus()" ou autre. Je deviens assez désespéré ici, toutes les suggestions seraient massivement appréciées.

+1

Focus est une sorte de rabat-joie dans WPF. Consultez ce post par Josh Smith http://joshsmithonwpf.wordpress.com/2010/03/16/control-input-focus-from-viewmodel-objects/, peut-être y at-il des indices pour une solution. – Matthieu

+0

Qu'en est-il d'une solution où vous sautez l'édition/validation dans la grille et utilisez simplement la grille pour l'affichage. Ensuite, quand une ligne de grille est dite, double-clique, vous ouvrez un éditeur de lignes de grille qui fonctionne comme l'édition de lignes dans la grille. – hkon

+0

Cela ne va certainement pas voler ... le client veut entrer des données directement dans la grille. J'ai essayé. Avez-vous utilisé des insertions en masse dans ObservableCollection qui est lié à votre grille de données? – drowned

Répondre

2

Mettez un écouteur d'événement dans le code derrière qui peut appeler votre nouveautextbox.focus() (et tout ce que vous voulez faire). Dans la validation du modèle de vue, déclenchez l'événement avec des arguments qui indiquent ce que vous voulez que votre grille fasse.

Editer: OK, nouvelle approche. Essayez de piéger les frappes, et en entrant ou en tabulant faites les choses que vous voulez faire.

Ce serait dans votre XAML

<Grid KeyUp="myDataGrid_KeyUp" > 

Cela irait dans votre code-behind

private void myDataGrid_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.Enter) 
     { 
      // do your enter stuff here, manipulate the view model for validation, etc. 
     } 
     else if (e.Key == Key.Tab) 
     { 
      // do your tab stuff here (get selected row, determine cell focus, focus on next cell) 
     } 
    } 
+0

Cela semble intéressant, mais, sans utiliser d'événements statiques, comment puis-je déclencher un événement dans le viewmodel qui pourrait être géré dans le codebehind? – drowned

+0

J'ai fini par abandonner l'approche MVVM pour cet écran et j'allais juste avec cette réponse purement en codebehind. Je n'ai tout simplement plus le temps de me battre avec cette architecture ridicule juste pour dire que c'est "MVVM". Trapping les événements clés fonctionne parfaitement, merci. – drowned

+0

Super! Content que ça a marché pour toi. J'ai aussi la plupart du temps MVVM, mais parfois vous avez juste à faire ce qui fonctionne pour que vous puissiez passer au prochain problème. –

Questions connexes