web-dev-qa-db-ja.com

ItemsControl DataTemplateでCanvasプロパティを設定する

これにデータバインドしようとしていますItemsControl

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

このDataTemplateを使用して、Node要素をCanvasに個別に正しく配置しようとしています。

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

ただし、期待どおりに機能していません。すべてのノード要素が同じ位置で互いの上に描画されます。これを達成する方法について何か提案はありますか?

70
atsjoo

添付プロパティは、Canvasの直接の子でのみ機能します。 ItemsControlはContentPresenterコントロールを直接の子として配置するため、そのためのスタイルを追加することもできます。

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

お役に立てれば

123
Arcturus