Question

Je suis en train de faire un graphique à barres usercontrol. Je crée chaque barre à l'aide d'un DataTemplate.

Le problème est pour calculer la hauteur de chaque barre, je dois d'abord connaître la hauteur de son conteneur (le TemplatedParent). Malheureusement, ce que j'ai:

Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height,  Converter={StaticResource HeightConverter}, Mode=OneWay}" 

ne fonctionne pas. Chaque fois qu'une valeur de NaN est retourné à mon convertisseur. Est-ce que RelativeSource={RelativeSource TemplatedParent} fonctionne pas dans ce contexte? Que puis-je faire pour permettre à mon DataTemplate de « parler » à l'élément auquel il est appliqué à?

Incase il aide ici est le barebone DataTemplate:

<DataTemplate x:Key="BarGraphTemplate">
    <Grid Width="30">
        <Rectangle HorizontalAlignment="Center" Stroke="Black" Width="20" Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height,  Converter={StaticResource HeightConverter}, Mode=OneWay}" VerticalAlignment="Bottom" />
    </Grid>
</DataTemplate>
Était-ce utile?

La solution

Pour répondre à votre question RelativeSource ne fonctionne que dans un ControlTemplate il ne fonctionne pas dans un DataTemplate.

Y at-il une raison pour laquelle le Silverlight Toolkit les contrôles ne fonctionnent pas pour vous dans la création d'un graphique à barres (ou un graphique à colonnes comme Tookit fait référence à jeu vertical de barres).

Autres conseils

Avez-vous essayé la propriété ActualHeight? Il devrait vous renvoyer une valeur. RelativeSource avec le mode TemplatedParent travailler dans un modèle de données, mais il retournera le présentateur contenu du contrôle basé sur un modèle / article, non le contrôle / élément lui-même (ce qui fait quand il est utilisé dans un modèle de contrôle) . Pour expérimenter, mettre un bouton dans le modèle de données et assignons cette expression de liaison (sans le chemin) à sa propriété Tag. Gérer son événement Click, et mettre un point d'arrêt dans le gestionnaire d'événements. Maintenant, lorsque vous exécutez le projet et cliquez sur le bouton, le point d'arrêt sera frappé dans votre code, et vous pouvez voir l'objet qu'il est obligatoire à partir de la propriété Tag du bouton (que vous pouvez voir à partir du paramètre de l'expéditeur). Espérons que cela aide ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top