如何使itemtemplate知道其包含的模板?

时间:2011-10-12 15:21:59

标签: wpf mvvm

我希望这个Ellipse从相应的BallViewModel中获取坐标,并使用它们来确定它在画布中的位置。 球的列表在mainviewmodel中绑定到List<BallVM>,因此我选择了一个带有画布面板的itemsControl。

这种做法是否正确?

如果我尝试绑定到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 个答案:

答案 0 :(得分:1)

当您将ItemTemplate与ItemControls一起使用时,它不直接将您的Elippses放在Canvas上,而是将它们包装到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>