2010-07-07 6 views
0

Comment afficher un total cumulé pour une colonne particulière de chaque enregistrement affiché dans un DataGrid? Je voudrais garder la logique de calcul dans le modèle de vue.DataGrid - Affichage du total cumulé du haut de la grille dans la ligne actuelle

sortie souhaitée:

 
Value  | Running Total 
25   25 
10   35 
-2   33 

Merci,
Ben

Edit: Gardez à l'esprit que quand une sorte DataGrid déclenché par l'utilisateur se produit, les totaux de fonctionnement doivent être recalculés parce que le dossier l'ordre d'affichage a changé.

Je voudrais vraiment mettre la logique pour cela dans le modèle de vue, pas dans le code WPF (par exemple, ne pas utiliser un IValueConverter).

+0

demandez-vous vraiment comment itérer sur une collection afin de calculer une somme? Sinon, cela peut être résolu dans la vue en utilisant un convertisseur de valeur. Quel est le type de votre collection et de votre disque? La classe record a-t-elle une propriété totale? Soutenez-vous le tri? Mises à jour de valeurs? –

+0

@WP - Je pense que la question ici est de savoir où mettre le total, pas comment l'obtenir. Votre première tendance est de se demander si la grille peut afficher un pied de page pour vous comme Excel peut le faire. Cheers – Berryl

+0

@ WP - J'utilise une ObservableCollection contenant des objets Item. Oui, la propriété totale; oui, le tri; non, mise à jour. –

Répondre

0

Il est seule idée: en fait, DataGrid utilise l'interface ICollectionView (http://msdn.microsoft.com/en-us/library/system.componentmodel.icollectionview.aspx) pour mettre en œuvre le tri (comme décrit dans http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid(VS.95).aspx au regroupement, de tri et de filtrage section

Ainsi, vous pouvez. créer une classe qui implémente l'interface ICollectionView et observer le tri avec la mise à jour correspondante du total cumulé

0

Je ne sais pas s'il existe une méthode recommandée/supportée/simple pour ce faire. Les choix auxquels je peux penser sont:
1) Avoir un élément ui en dehors de la grille de données pour contenir le total. C'est facile à lier à votre machine virtuelle, mais un peu de mal à résoudre les problèmes d'alignement qui vont venir, car vous voulez probablement le total juste sous la colonne. C'est ce que je recommanderais.
2) avoir une dernière rangée fictive dans la grille; Cela résout le problème d'alignement, mais ajoute une logique hacky à la VM, et ne semble pas très bien sur le dessus.

HTH,
Berryl

0

Si cela ne vous dérange pas la réponse en VB ou C# puis this tutorial montre comment faire ce que vous voulez en VB et this tutorial il montre en C#. Les deux utilisent une colonne fictive dans la grille.

+0

ouais, je suis d'accord. Je pensais qu'il voulait un total pour une colonne pour aller dessous. Cheers – Berryl

0

Consultez cette réponse pour savoir comment ajouter une colonne de nombre de lignes à un contrôle ListBox et remplir à l'aide d'un convertisseur de valeur. Au lieu de compter l'élément, additionnez la somme des éléments. Si vous avez besoin de la somme totale dans votre machine virtuelle, ce n'est bien sûr pas une bonne solution.

Numbered listbox

+0

Avez-vous eu le lien pour la réponse que vous avez mentionnée? –

+0

Merci, a ajouté le lien manquant –

+0

Ceci est une approche intéressante. Merci de l'avoir partagé. Une des choses intéressantes à ce sujet est que les objets de la collection passée à ItemsSource de la grille n'ont pas besoin d'avoir une propriété Balance. –

Questions connexes