2009-08-12 4 views
65

私はこのItemsControlにデータバインドしようとしています:ItemsControl DataTemplateでのキャンバスプロパティの設定

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

このDataTemplateを使用することで、Canvas上のNode要素を個別に配置しようとしています:

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

しかし、予想通り。すべてのノード要素が同じ位置に重ねて描画されます。どのようにこれを達成するための任意の提案?

答えて

111

添付されたプロパティは、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> 

ホープこれは

+0

ありがとう役立ちます。私は約5分前に自分でこの解決法を見つけました。私は質問を投稿するには少し速かったと思う。 :) – atsjoo

+7

Hehe ..私もそれらのAHAの瞬間が大好きです;)..そして、それはすべて悪くはありません..あなたの質問は他の人にも一日助けてもいいでしょう。 – Arcturus

+0

それは確かに両方のおかげです – amaca

関連する問題