J'ai un TreeView
, et chaque TreeViewNode
a un objet dans sa propriété Tag
. Quand un nœud dans l'arborescence est sélectionné, je veux qu'un DataGrid
soit rempli avec le nom et la valeur de tous les champs de l'objet, obtenus par réflexion. Je ne peux pas comprendre comment faire cela en utilisant wpf databinding. Il y a très peu d'exemples de la façon dont vous liez exactement un DataGrid
en utilisant des méthodes simples, et j'utilise aussi une fonction de conversion.Comment lier ces données à un DataGrid?
Ce que j'ai jusqu'à présent est une méthode pour obtenir les données que je veux partir d'un seul objet:
internal static IEnumerable<Tuple<string, object>> GetFieldInfo(object o)
{
return
from FieldInfo info in o.GetType().GetFields()
select Tuple.Create(info.Name, info.GetValue(o));
}
et le treeview et DataGrid en XAML:
<TreeView Name="objectList" />
<DataGrid Name="objectData" />
je peux » t trouver les bonnes incantations DataBinding pour obtenir la propriété ((TreeViewNode)objectList.SelectedItem).Tag
via la méthode GetFieldInfo
et dans la propriété objectData.ItemsSource
.
Vous ne devriez pas avoir à utiliser la réflexion pour un maître/détails approcher –
J'ai besoin d'énumérer tous les champs de l'objet dans le tag (les objets peuvent être des types arbitraires) et les valeurs des champs dans la grille. Comment suis-je censé faire cela sans utiliser la réflexion? – thecoop
Couple de choses ... ignore la propriété Tag car elle associe la vue de manière significative et lie vos données dans votre VieWModel via la propriété TreeView.SelectedItem; où une fois qu'un utilisateur sélectionne un nouveau noeud, votre DataGrid sera mis à jour via ViewModel au lieu d'essayer d'extraire des données hors de l'étiquette. Quelles que soient les données que vous voulez sur le modèle, je mettrais quelque chose sur le modèle lui-même pour retourner les valeurs; peut-être abstrait dans une classe de base/interface (oui, vous aurez toujours besoin de réflexion que vous avez déclaré pour cet effort) –