Establecer las propiedades del lienzo en una plantilla de datos ItemsControl

80

Estoy tratando de vincularme a esto ItemsControl:

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

Al usar esto DataTemplate, estoy tratando de colocar individualmente mis Nodeelementos Canvascorrectamente:

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

Sin embargo, no funciona como se esperaba. Todos los elementos de mi nodo se dibujan uno encima del otro en la misma posición. ¿Alguna sugerencia sobre cómo lograr esto?

atsjoo
fuente

Respuestas:

137

Las propiedades adjuntas solo funcionan en elementos secundarios directos de Canvas. ItemsControlcolocará ContentPresentercontroles como sus hijos directos, por lo que es posible que desee agregar un estilo para eso también:

<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
fuente
Gracias. Encontré esta solución hace unos 5 minutos. Supongo que fui un poco rápido al publicar la pregunta. :)
atsjoo
9
Jeje ... Me encantan esos momentos AHA también;) .. Y no es del todo malo ... Quizás tu pregunta también pueda ayudar a otras personas algún día ... ¡Nunca lo sabrás!
Arcturus
También ayudó aquí, +1 para todos. :)
Rune Jacobsen
1
@skb Tengo el mismo problema, ¿hay alguna solución de Silverlight para esto?
themaestro
4
¿Qué pasa si mi posición X e Y debe estar dentro de uno de los objetos de ItemsSource? Tengo un objeto Point en mi ItemsSource.
El Mac