2010-08-13 3 views
0

Je suis un programmeur novice et je l'ai fait plus comme un passe-temps qu'une carrière. En tant que tel, je suis en train de mettre en place une application pour générer des factures pour l'entreprise pour laquelle je travaille. J'ai le travail de facturation qui prend en charge les flux de données de nos fournisseurs et fait correspondre les clients, les produits et les tarifs, etc. et produit les factures. J'essaye maintenant de l'améliorer et de permettre que le client et les détails de taux soient édités. Une partie de cela signifie que j'ai un certain nombre de tables qui contiennent des valeurs de recherche, par exemple. Taux de TVA, valeur de balisage, tarifs personnalisés..NET4 WPF Datagrid - Répondre à différents types de données

J'écris l'application dans WPF, C#, .Net 4. J'essaie également de garder le modèle MVVM pour séparer les couches.

J'ai créé un VeiwModel générique appelé EditLookupTableViewModel qui gère la discussion avec la couche de données et tout le reste. Mon problème est avec la vue. Je voudrais créer une vue unique qui peut gérer tous les types de données que j'autorise sur la classe ci-dessus. Le morceau sur lequel je suis coincé est celui-ci. Je voudrais présenter les données comme une liste des valeurs actuelles dans la table de base de données et permettre aux gens de modifier ces valeurs, ou ajouter de nouvelles valeurs. Les différents types de données sont tous basés sur des tables d'une base de données SQL accédant via Entity Framework 4. Les tables n'ont pas toutes le même nombre ou le même type de colonnes.

Si je présente les données sous forme de liste à l'aide d'un contrôle DataGrid, comment puis-je modifier les types de colonne en fonction du type de données affiché?

J'ai fait des recherches sur différents sites mais je n'ai rien trouvé qui me convienne.

Je pensais pouvoir utiliser un DataTemplate, puis utiliser un DataTemplateSelector mais je ne vois aucun moyen de créer un DataTemplate pour un DataGrid. J'ai alors pensé que j'utiliserais un ContentPresenter mais je ne vois pas comment sélectionner le template. Idéalement, je voudrais utiliser un TemplateSelector sympa comme je pourrais alors contrôler le modèle à partir du code car plusieurs tables ont la même structure et donc ce serait génial de réutiliser le template pour ces tables qui sont identiques.

Toute aide serait très appréciée car je suis sûr qu'il doit y avoir une solution plus élégante que de créer plusieurs vues.

Merci

Simon

Répondre

0

je regarderais dans WCF RIA mais il faudrait quelques changements à la façon dont vous interagissez avec les données. Fondamentalement, vous avez un modèle d'entité qui gère l'état persistant dont vous avez besoin pour les opérations CRUD, et une jolie grille de données silverlight où vous pouvez éditer une cellule à la fois. Il y a des échantillons sur le Net, et je peux en trouver un si vous avez besoin de moins de 30 minutes pour avoir un échantillon opérationnel.

+0

Merci pour la réponse rapide. C'est peut-être une solution, mais je ne veux pas utiliser la WCF à ce stade. De plus, je ne veux pas utiliser Silverlight. La plate-forme est WPF et il restera ainsi pour des raisons indépendantes de la portée de ce post. Ce que je voudrais, c'est que le DataGrid change le nombre et le type de ses colonnes en fonction du type d'objet que je lui passe mais je ne veux pas le laisser générer automatiquement ces colonnes car je ne veux pas forcément pour afficher toutes les colonnes tout le temps. – SBuckner

0

Cette answer pourrait vous aider. Il permet d'ajouter et de supprimer des colonnes de type MVVM. Notez que la réponse se lie à une collection de DataGridColumns.I l'ai modifiée pour la lier à mon ColumnViewModel. De cette façon, je pense que ma solution est plus MVVM car elle ne nécessite pas l'utilisation d'un contrôle namepsace dans mon code ViewModel.

Vous pouvez faire similaire en fonction de cette réponse, et éventuellement créer différentes sous-classes de votre ColumnViewModel pour lier et utiliser GetType dans l'extension pour répondre à vos besoins indiqués dans la question.