J'utilise le WPF 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). P>
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. P>
La grille est liée à un DataGrid code> (
dataTable code>, si cela fait toute différence. P>
7 Réponses :
Au lieu de travailler sur des événements dans votre Strong> View Strong> (la grille), je vous recommande de regarder l'objet lié et de mettre votre logique là-bas. Cela conserve votre em> avec vos objets em>. P>
Étant donné que vous êtes lié à un datatable code>, le moyen le plus simple est de simplement vous abonner à
datatable.tablenewrow code>
. p>
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.
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 p> code derrière p> Tous les crédits pour cela solution aller à diederik krolls ( Poste original ). Mon respect. P> p>
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é xaml: p> < Pré> xxx pré> code derrière en C #: p> Newitem code> du
addingnewitemeventargs code>.
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 code> AddingNewitem code> ne déclenche pas si les éléments sont ajoutés via itemsSource code> 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.
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. P>
Ainsi, la configuration est que vous avez un Voici comment le DataGrid semble fonctionner lorsqu'il ajoute une ligne automatiquement: p>
Observablecollection
itemsSource code> de votre Datagramrid. Vous devez créer
myViewModel code> dans la couche de modèle de vue. P>
MyViewModel code> il se liera à la ligne en appelant le constructeur par défaut sur le type. Qui sait pourquoi cela fait cela, mais si
myViewModel code> 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. em> 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. Li>
addingnewitem code>: 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 code> a un setter et vous pouvez échanger l'élément actuel pour votre propre. Li>
ol>
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. P>
contrairement à addingnewitem code>, DataGrid.LoadingRow Event (disponible car .NET 4.0) sera tiré pour les éléments ajoutés via
itemsource code> Binding. P>
En vous XAML, incluez le code suivant dans la balise de votre fenêtre:
private void LoadingRowHandlerMethod(DataGridRowEventArgs e) { //.... //.... }