2010-07-25 4 views
0

Désolé pour le titre verbeux - Je bats travailler si mes problèmes sont causés parComment accéder à une valeur basée sur les frères et sœurs ou parents dans DataGrid databinding

  1. Une mauvaise conception de classe (probablement)
  2. Ignorance (très probable)
  3. les deux (très probablement)

J'ai passé les âges googler, mais en raison de ne pas vraiment comprendre mon problème, il est plus difficile de trouver la solution. Fondamentalement, j'ai une classe "Day" qui a une ObservableCollection of Period appelée Périodes. Chaque période a une durée. J'ai une méthode/propriété de ma classe Day (TotalTimeUpUnTilThisPeriod) qui prend un point et renvoie la durée de toutes les périodes jusqu'à ce point.

J'ai besoin de mettre ce niveau de Période pour que ma grille de données puisse s'y lier (son itemsource est défini sur Day.Periods et son datacontext sur Day). Cependant, je dois faire le calcul dans le Jour comme les instances de période ne savent rien de leurs frères et soeurs et il se sent mal si un enfant a remonté l'arbre au niveau des parents et a sommé les enfants.

Ma pensée est la suivante - une période ne devrait avoir aucun "état" ie. aucune idée de l'endroit où il se trouve dans la journée par rapport à ses frères et soeurs - c'est le travail de la classe Day. Donc, si ma conception de classe est correcte - comment puis-je accéder au datacontext dans une colonne de données liée? J'ai essayé d'écrire un convertisseur qui prendrait un certain temps et récupèrerais le datacontext parent (Day) et j'appellerais ma méthode pour renvoyer une chaîne à lier au niveau de la période) mais je ne pouvais pas comprendre comment rendre mon convertisseur conscient du datagrid datacontext et je veux savoir si je suis sur la bonne voie. Ceci est probablement une mauvaise conception, mais j'ai envisagé de répliquer la propriété parent (par exemple TotalTimeUpUnTilThisPeriod) dans la classe enfant (Period) puis de la définir chaque fois qu'une durée a changé pour que je puisse la lier mais elle est vraiment désordonnée.

Les périodes peuvent être ajoutés/retirés de la grille de données/jour ne peut donc pas être calculé sur rowload - il doit être dynamique (je suppose que je pourrais utiliser LINQ pour additionner les longueurs de toutes les périodes précédentes)

Donc, je pense que mes questions sont:

  1. Est-ce que ma conception de classe ci-dessus est acceptable? (Ie. les enfants doivent savoir rien le parent ou leurs autres frères et sœurs?)
  2. Si oui, comment lier-vous propriétés parent ou méthodes dans un DataGrid si une valeur est dépendante de l'état du parent?

Merci pour les pointeurs.

MISE À JOUR:

Voici quelques choses que j'ai essayé à la lumière froide du jour:

1) Text= "{Binding DataContext.SomeTextField, ElementName=LayoutRoot}"

Cela ne fonctionne pas - il fonctionne très bien quand en dehors du DataGrid mais pas quand à l'intérieur. 2) J'ai essayé de définir le DataContext d'une zone de texte dans une colonne DataGrid basée sur un modèle - cela fonctionne bien, mais ensuite je dois passer dans la ligne datacontext ET le datacontext parent à un convertisseur (afin de rechercher le temps total toutes les périodes avant celle-ci) et je ne peux pas comprendre comment faire cela. Donc, une autre question peut être - Comment passez-vous dans le datacontext de la ligne courante à un convertisseur ET au datacontext parent (ou simplement "comment rendre un convertisseur conscient du datacontext parent").

Répondre

0

Voici ce que je l'ai fait à la fin - j'aimerais savoir si cela est une bonne pratique ou non:

J'ai fait la classe parente d'une propriété sur la classe des enfants (ce qui sentait si mal?) - maintenant Je peux référencer les propriétés du parent dans le DataGrid.

Questions connexes