Festlegen von Canvas-Eigenschaften in einer ItemsControl-Datenvorlage

79

Ich versuche, Daten zu diesem Thema zu binden ItemsControl:

<ItemsControl ItemsSource="{Binding Path=Nodes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

Auf diese Weise DataTemplateversuche ich, meine NodeElemente individuell Canvasrichtig zu positionieren :

<DataTemplate DataType="{x:Type Model:EndNode}">
    <Controls:EndNodeControl Canvas.Left="{Binding Path=XPos}" Canvas.Top="{Binding Path=YPos}" />
</DataTemplate>

Es funktioniert jedoch nicht wie erwartet. Alle meine Knotenelemente werden an derselben Position übereinander gezeichnet. Irgendwelche Vorschläge, wie dies erreicht werden kann?

atsjoo
quelle

Antworten:

136

Die angehängten Eigenschaften funktionieren nur für direkte Kinder der Canvas. ItemsControlplatziert ContentPresenterSteuerelemente als direkte untergeordnete Elemente, daher möchten Sie möglicherweise auch dafür einen Stil hinzufügen:

<ItemsControl ItemsSource="{Binding Path=Nodes}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Canvas.Left" Value="{Binding Path=XPos}" />
            <Setter Property="Canvas.Top" Value="{Binding Path=YPos}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>
Arcturus
quelle
Vielen Dank. Ich habe diese Lösung vor ungefähr 5 Minuten selbst gefunden. Ich glaube, ich war ein bisschen schnell beim Posten der Frage. :)
Atsjoo
9
Hehe .. Ich liebe diesen AHA-Moment auch;) .. Und es ist nicht alles schlecht .. Vielleicht kann deine Frage eines Tages auch anderen Menschen helfen .. Du wirst es nie erfahren!
Arcturus
Es hat auch hier geholfen, +1 für alle. :)
Rune Jacobsen
1
@skb Ich habe das gleiche Problem. Gibt es dafür eine Silverlight-Problemumgehung?
Themaestro
4
Was ist, wenn sich meine X- und Y-Position in einem der Objekte von ItemsSource befinden sollte? Ich habe ein Point-Objekt in meiner ItemsSource.
El Mac