WPF Datagrid reliure personnalisée en-têtes de colonne
Je suis à essayer de comprendre comment lier un WPF grille de données de l'en-tête de colonne et les principales données à une source de données à l'aide d'un modèle MVVM. Le résultat, je suis à la recherche d'ressemblerait à ceci:
le texte d'alt http://brian.vallelunga.com/files/datagrid-custom-headers.PNG
J'ai réussi à parer les en-têtes ici, mais je n'en suis pas sûr comment faire pour lier les valeurs dans les en-têtes. Plus précisément, la propriété IsChecked de la case, l'index sélectionné de la boîte combo et la valeur de la zone de texte.
J'étais auparavant à l'aide d'un simple DataTable pour remplir la grille principale de données, mais je vais avoir besoin de quelque chose de plus complexe pour tenir à la fois la grille de données et les valeurs de chaque colonne. Ou peut-être que je peux les conserver comme des entités séparées entièrement.
Donc, quelqu'un a une idée de comment je pourrais tirer de cette liaison? Une limitation est que les colonnes doivent être auto-généré depuis je n'ai aucune idée de ce à quoi ils vont jusqu'à l'exécution. L'application, il suffit de charges, le formulaire de données d'une feuille de calcul Excel, et il peut être n'importe quel nombre de colonnes présentes.
Grâce,
Brian
OriginalL'auteur Brian Vallelunga | 2010-02-03
Vous devez vous connecter pour publier un commentaire.
Voici ce que j'ai fait pour l'utiliser avec le modèle MVVM:
J'ai deux ensembles de données pour la liaison sur mon modèle de vue: l'un pour la grille de données et une pour les en-têtes de colonne. Actuellement, celles-ci sont exposées comme deux propriétés:
Le truc à travailler avec les deux différents ensembles de données dans la grille. J'ai sous-classé la grille de données et compte tenu de la grille d'une source de données supplémentaire appelé ColumnSource, comme une propriété de dépendance. C'est ce qui est lié à la ColumnData sur mon modèle de vue. J'ai ensuite définir l'en-tête de chaque auto-généré colonne pour les données indexées dans la ColumnSource de la source de données. Le code est comme suit:
Je peux maintenant effectuer normal de liaison de données dans le basé sur un modèle d'en-tête de mes colonnes, qui tous se lier contre les données dans le ColumnData propriété de mon point de vue modèle.
Mise à JOUR: j'ai été invité à montrer le code XAML pour ma grille. C'est vraiment de base, mais ici il est:
Et voici le ImporterColumnHeaderStyle:
Vous pouvez ignorer ImporterDataGridColumn et il suffit d'utiliser DataGridTextColumn. C'est juste une colonne standard que je sous-classé en pensant que j'aurais besoin de fonctionnalités supplémentaires, mais n'a pas. L'ensemble de la grille de code est ci-dessus. Le modèle de vue expose le GridData et ColumnData propriétés énumérées ci-dessus, les données peuplée à partir de là où vous voulez. Le code XAML puis crochets les deux: <Contrôles:ImporterDataGrid AutoGenerateColumns="True" ... ItemsSource="{Binding GridData}", ColumnSource="{Binding ColumnData}" />
Pourriez-vous (jolie s'il vous plaît) ajouter la vue xaml pour cela?
OriginalL'auteur Brian Vallelunga
Je suis certainement un WPF /MVVM /liaison de données noob, mais qui ont travaillé dur sur ce genre de choses dernièrement. Je ne sais pas ce que vous avez câblé jusqu'à présent, mais d'abord, vous devrez définir le DataContext de la Vue. Puisque vous êtes en utilisant MVVM, je suppose que vous avez un ViewModel, de sorte que devrait être le DataContext de la Vue.
c'est à dire si vous avez votre Vue de créer et /ou propriétaire de votre ViewModel, il pourrait ressembler à quelque chose comme ceci:
Vous pouvez facilement databind votre CheckBox, ComboBox et TextBox de propriétés dans votre ViewModel. J'ai trouvé le plus simple est de faire votre ViewModel hériter d'une base de classe viewmodel, comme le un que Josh Smith a écrit. Cela vous donnera une méthode pour appeler en interne lorsque vous souhaitez que le ViewModel de notifier à l'interface graphique de tout changement dans les valeurs.
En supposant que vous avez des propriétés comme ImportColumn, LastName et LastNameText (tous les C# propriétés, pas champs cet appel OnPropertyChanged en conséquence), puis votre code XAML ressemblerait à quelque chose comme ceci:
J'espère que cela vous aide. Si non, s'il vous plaît commentaire et je vais essayer de faire du mieux que je peux pour essayer d'autres choses.
OriginalL'auteur Dave
Nous faire quelque chose de semblable dans notre application.
Ce que j'ai fait est dérivé de mon propre type de colonne (DataGridSearchableBooleanColumn), puis-je remplacer la DataGridColumnHeader modèle, j'ai mis deux présentateurs. la première fois que je lier le contenu (le même que le modèle par défaut) la deuxième je la lie de la colonne. J'utilise un modèle de données pour la colonne (j'ai un peu d'entre eux pour les différents types de recherche (texte, liste déroulante, boolean). puis-je ajouter les propriétés supplémentaires de la colonne, de sorte que je peux lier à eux. Voir si ce code a du sens.
c'est là que la grille tombe, ce n'est pas tout à fait faisable en un pattern mvvm, car les colonnes de la collection est en lecture seule (vous pouvez ajouter supprimer mais pas ensemble) je sous-classe de la grille, donner un supplément de propriété qui est une interface, puis lier cela à mon modèle de vue. ensuite, laissez gère les colonnes dans le code. Une autre solution consiste à sous-classe de la grille de lui donner une autre collection de colonnes que vous pouvez lier et de surveiller les modifications apportées sur ce à ajouter/supprimer des colonnes. (alors votre modèle de vue pourrait se lier directement)
OriginalL'auteur Aran Mulholland