2010-12-15 86 views
2

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.

+0

Vous ne devriez pas avoir à utiliser la réflexion pour un maître/détails approcher –

+0

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

+0

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) –

Répondre

0

Would quelque chose comme cette aide, Looking for an object graph tree-view control for WPF

Sinon, vous pouvez lier à l'élément de l'arborescence sélectionnée comme si

<DataGrid Name="objectData" DataSource={Binding ElementName=objectList, Path=SelectedItem} /> 

Si vous aviez une sorte de propriété dans les objets que vous utilisez pour la TreeView aime un type d'objet Key/Value, par exemple ObjectProperty (clé de chaîne, valeur d'objet) et il a été exposé dans une collection appelée ObjectProperties. Ensuite, vous pouvez lier à cela dans votre à DataGrid et avoir AutoGenerate les colonnes et les données fror vous

<DataGrid Name="objectData" DataSource={Binding ElementName=objectList, Path=SelectedItem.ObjectProperties} />