web-dev-qa-db-fra.com

Définition des propriétés du canevas dans un DataTemplate ItemsControl

J'essaie de lier des données à ce ItemsControl:

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

En utilisant ce DataTemplate, j'essaie de positionner individuellement mes Node éléments sur le Canvas correctement:

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

Cependant, cela ne fonctionne pas comme prévu. Tous mes éléments de noeud sont dessinés les uns sur les autres dans la même position. Des suggestions sur la façon d'accomplir cela?

70
atsjoo

Les propriétés attachées ne fonctionnent que sur les enfants directs du canevas. ItemsControl placera les contrôles ContentPresenter comme ses enfants directs, vous pouvez donc également ajouter un style pour cela:

<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>

J'espère que cela t'aides

123
Arcturus