2011-10-30 6 views
2

Je suis assez nouveau pour WPF et j'ai un problème que je ne peux pas résoudre. Il y a un jeu de données avec deux tables, T1 et T2. T1 a une structure récursive comme celui-ciLiaison à TreeView et DataGrid

T1Id
ParentId
Nom

et cette relation:

ds.Relations.Add("RecursiveRel", 
    tables["T1"].Columns["T1Id"], 
    tables["T1"].Columns["ParentId"]); 

J'afficher ce tableau dans un TreeView par liaison à un DataView:

DvT1 = ds.Tables[0].DefaultView; 
DvT1.RowFilter = string.Format("Id = '{0}'", IdOfFirstRecord); 

Et en XAML:

<TreeView ItemsSource="{Binding DvT1}"> 
    <TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding RecursiveRel}"> 
     <TextBlock Text="{Binding Name}" /> 
    </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

Cela fonctionne très bien et affiche la hiérarchie bien dans l'arborescence.

Et maintenant table T2 entre en jeu qui a cette structure:

T2Id T1Id Nom

Il y a 1: n relation entre T1 et T2 où n> = 0. Une relation a été ajouté à l'ensemble de données:

ds.Relations.Add("T1ToT2", 
    tables["T1"].Columns["T1Id"], 
    tables["T2"].Columns["T1Id"]); 

T2 utilise une grille de données et il devrait uniquement les enregistrements d'affichage qui sont liées à l'enregistrement de T1 sélectionné. Que devrait aller dans ItemsSource du DataGrid pour que cela se produise? Je n'ai rien trouvé qui ferait ça. Je devrais également remarquer, si cela est important, qu'il s'agit d'une application MVVM, donc le code-behind n'est pas une option.

Toute aide est grandement appréciée.

+0

Si c'est l'application MVVM, pourquoi utilisez-vous ces tables et relations étranges? Il est recommandé de transformer tous les modèles pour afficher des modèles et utiliser des propriétés réelles et des collections observables au lieu de jeux de données et d'autres vues dynamiques. – vorrtex

+0

Voici comment je reçois les données d'un système distant (non Microsoft). Pourquoi ces tables sont-elles étranges? En raison de la structure récursive de T1? – JKO

+0

En raison des littéraux de chaîne et des crochets. Au début, il serait préférable de créer des modèles de vue pour chaque modèle de données, car la liaison à une classe comme la classe T1ViewModel {public ObservableCollection T2Items {get; ensemble; }} 'est beaucoup plus pratique et plus facile. – vorrtex

Répondre

2

Avez-vous essayé?

<DataGrid ItemsSource="{Binding SelectedItem.T1ToT2, ElementName=theTreeView}" /> 
+0

Ahh, ça a marché! Merci! Oui, je sais, je ne devrais pas être trop dogmatique sur le code-behind et MVVM. Je vais aussi essayer la suggestion de Vorrtex et transformer le Dataset en ObservableCollection/Properties. – JKO