4 Stimmen

Silverlight RelativeSource von TemplatedParent Bindung innerhalb eines DataTemplate, Ist es möglich?

Ich versuche, ein Bargraph-Benutzerkontrollsystem zu erstellen. Ich erstelle jeden Balken mit einer DataTemplate .

Das Problem ist, um die Höhe jedes Balkens zu berechnen, muss ich zunächst die Höhe des Containers kennen (die TemplatedParent ). Leider, was ich habe:

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

funktioniert nicht. Jedes Mal, wenn ein Wert von NaN wird an meinen Konverter zurückgegeben. Ist RelativeSource={RelativeSource TemplatedParent} in diesem Zusammenhang nicht funktionieren? Was kann ich sonst noch tun, damit mein DataTemplate mit dem Element, auf das es angewendet wird, "sprechen" kann?

Incase es hilft hier ist die Barebones 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>

5voto

AnthonyWJones Punkte 182582

Um Ihre Frage zu beantworten: RelativeSource funktioniert nur in einer ControlTemplate es funktioniert nicht in einem DataTemplate .

Gibt es einen Grund, warum die Silverlight-Toolkit-Diagramm Steuerelemente bei der Erstellung eines Balkendiagramms (oder eines Säulendiagramms, wie es im Tookit für vertikale Balken bezeichnet wird) nicht funktionieren.

0voto

Chris Anderson Punkte 8009

Haben Sie die Eigenschaft ActualHeight ausprobiert? Sie sollte Ihnen einen Wert liefern. RelativeSource mit dem Modus TemplatedParent wird funktioniert in einer Datenvorlage, gibt aber den Content Presenter des Steuerelements/Elements in der Vorlage zurück, nicht das Steuerelement/Element selbst (was bei Verwendung in einer Steuervorlage der Fall ist). Um zu experimentieren, fügen Sie eine Schaltfläche in die Datenvorlage ein und weisen Sie diesen Bindungsausdruck (ohne den Pfad) der Eigenschaft Tag zu. Behandeln Sie das Click-Ereignis und setzen Sie einen Haltepunkt in den Ereignishandler. Wenn Sie nun das Projekt ausführen und auf die Schaltfläche klicken, wird der Haltepunkt in Ihrem Code getroffen, und Sie können das Objekt sehen, das es aus der Tag-Eigenschaft der Schaltfläche (die Sie aus dem Absenderparameter sehen können) gebunden ist. Hoffentlich hilft das...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X