12
votes

WPF DataGrid - événement pour de nouvelles lignes?

J'utilise le WPF DataGrid ( .NET 3.5 SP 1 Version de la Toolkit )

Quel événement puis-je m'abonner pour détecter quand une nouvelle ligne est ajoutée? (E. l. Lorsque l'utilisateur déplace le curseur vers le bas ou appuie entrer, une nouvelle ligne vierge est ajoutée à la grille).

Finalement ce que je veux faire, c'est utiliser cet événement pour calculer certaines valeurs par défaut et les mettre dans la nouvelle ligne.

La grille est liée à un dataTable , si cela fait toute différence.


0 commentaires

7 Réponses :


8
votes

Au lieu de travailler sur des événements dans votre View (la grille), je vous recommande de regarder l'objet lié et de mettre votre logique là-bas. Cela conserve votre avec vos objets .

Étant donné que vous êtes lié à un datatable , le moyen le plus simple est de simplement vous abonner à datatable.tablenewrow .


3 commentaires

Je suis entièrement d'accord. Cela vous donnera beaucoup plus de flexibilité. Par exemple, un jour à l'avenir, vous pouvez vouloir un moyen personnalisé d'ajouter une nouvelle ligne au lieu d'utiliser le datagramrid. Dans ce cas, tout sera déjà en place parce que vous ne vous souciez que d'un nouvel objet a été ajouté à votre collection ... vous pouvez vous en soucier de la manière dont il a été ajouté.


J'avais regardé l'événement tapant des tapis de données, mais cela ne tienait pas au bon point pour moi. Mais l'événement de Tablenewrow incendie au bon moment (lorsque la nouvelle ligne est générée). Merci.


Dans le scénario comme un comportement personnalisé, cette remarque est inutile. Création actuellement d'un comportement mettant en surbrillance les lignes avec les mêmes valeurs (pour une colonne donnée) comme des éléments sélectionnés, je ne veux pas attacher la source d'élément sur chaque rangée.



9
votes

Les objets sont persistés (insérés ou mis à jour) lorsque l'utilisateur quitte une ligne d'édition. Se déplacer vers une autre cellule de la même ligne met à jour la propriété correspondante via une liaison de données, mais ne signalent pas encore le modèle (ou la couche d'accès aux données). Le seul événement utile est DataGrid.roweDitorer. Ceci est tiré juste avant d'avoir commis la ligne modifiée.

xaml xxx

code derrière xxx

Tous les crédits pour cela solution aller à diederik krolls ( Poste original ). Mon respect.


0 commentaires

14
votes

L'événement que vous recherchez est DataGrid.addingNewitem Event . Cet événement vous permettra de configurer le nouvel objet comme vous le souhaitez, puis de l'appliquer à la propriété Newitem du addingnewitemeventargs .

xaml: < Pré> xxx

code derrière en C #: xxx


3 commentaires

Je viens de comprendre que je n'aurais pas mentionné que ce n'est pas disponible avant .net 4.5, pour ceux qui utilisent toujours des versions plus anciennes du .NET Framework.


L'événement AddingNewitem ne déclenche pas si les éléments sont ajoutés via itemsSource liaison.


@wondra, correct. L'événement ne fait que des incendies basés sur les interactions entrées de l'utilisateur avec la grille. C'est le meilleur endroit pour initialiser une nouvelle instance de données basée sur l'interaction utilisateur avec la grille. Du point de vue de la grille, toute modification que vous apportez à l'itemSource est un changement provenant de votre magasin de données et non de l'utilisateur. Essayer de manipuler les objetsSource dans le but d'initialiser le nouvel objet enfreindre l'interaction de l'utilisateur avec la grille.



3
votes

J'ajoute cela parce que je viens de passer près de 2 heures à essayer de déterminer comment obtenir le DataGrid pour ajouter une nouvelle ligne lorsque vous êtes lié à une collection de modèles de vision et que vous devez contrôler la construction de la construction de ces modèles de vue.

Ainsi, la configuration est que vous avez un Observablecollection lié ​​au itemsSource de votre Datagramrid. Vous devez créer myViewModel dans la couche de modèle de vue.

Voici comment le DataGrid semble fonctionner lorsqu'il ajoute une ligne automatiquement:

  1. Lorsqu'il crée cette ligne vierge au bas, il crée une nouvelle instance de MyViewModel il se liera à la ligne en appelant le constructeur par défaut sur le type. Qui sait pourquoi cela fait cela, mais si myViewModel n'a pas de constructeur par défaut, il ne manquera pas de montrer cette ligne vierge. C'est probablement l'endroit que vous êtes bloqué, car vous n'avez pas de constructeur par défaut, car vous devez créer vous-même l'objet vous-même. Malheureusement, vous aurez besoin d'y aller et d'y ajouter un. Notez que si le type d'élément est une interface, cela est condamné à une défaillance. Le type d'élément de la collection doit être une classe de béton avec un constructeur par défaut.
  2. Maintenant, il attend que l'utilisateur puisse éditer la ligne, à quel point il démarre l'ajout approprié.
  3. Il augmente le addingnewitem : C'est ici que vous pouvez intercepter l'opération Ajout et éteindre l'instance de création de constructeur par défaut créée avec votre propre instance. Le addingnewitemeventargs.newitem a un setter et vous pouvez échanger l'élément actuel pour votre propre.

0 commentaires

2
votes

J'ai trouvé l'événement DataGrid_InitializingNewitem pour être utile où vous pouvez examiner E.Newitem et prendre les actions appropriées en fonction de son type.


0 commentaires

0
votes

contrairement à addingnewitem , DataGrid.LoadingRow Event (disponible car .NET 4.0) sera tiré pour les éléments ajoutés via itemsource Binding.


0 commentaires

0
votes

En vous XAML, incluez le code suivant dans la balise de votre fenêtre:

private void LoadingRowHandlerMethod(DataGridRowEventArgs e)
{
  //....
  //....
}


0 commentaires