2011-10-12 46 views
1

我想让这个Ellipse从它相应的BallViewModel中获取它的坐标,并使用它们来确定它在画布中的位置。 在mainviewmodel中,球的列表绑定到List<BallVM>,因此我选择了一个具有画布面板的itemsControl。如何让itemtemplate意识到它的包含模板?

这种方法是否正确?

如果我尝试绑定到itemcontainerstyle内的X和Y,那么它不是特定于某个球。

无论我在Canvas.bottom或canvas.left属性中设置的椭圆始终位于左上角。

<Grid> 
     <ItemsControl ItemsSource="{Binding Balls}" Background="red"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <Canvas MouseMove="Canvas_MouseMove" Background="Blue"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 

      <ItemsControl.ItemTemplate> 
       <DataTemplate DataType="{x:Type VM:BallVM}"> 
        <Ellipse Canvas.Bottom="{Binding Y}" Canvas.Left="{Binding X}" Width="100" Height="100" Fill="Red"/> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Grid> 

回答

1

当您使用一个ItemTemplate与ItemControls它不直接把你Elippses画布上,但它们包装成一个ContentPresenter。所以你必须在ItemsPresenter上应用canvas.Bottom/Left属性。您可以使用ItemContainerStyle执行此操作:

<ItemsControl.ItemContainerStyle> 
      <Style> 
       <Setter Property="Canvas.Bottom" Value="{Binding Y}" /> 
       <Setter Property="Canvas.Left" Value="{Binding X}" />      
      </Style> 
</ItemsControl.ItemContainerStyle> 
<ItemsControl.ItemTemplate> 
      <DataTemplate DataType="{x:Type VM:BallVM}"> 
       <Ellipse Width="100" Height="100" Fill="Red"/> 
      </DataTemplate> 
</ItemsControl.ItemTemplate>