【问题标题】:How to make itemtemplate aware of its containing template?如何让 itemtemplate 知道其包含的模板?
【发布时间】:2011-10-12 15:21:59
【问题描述】:

我希望这个 Ellipse 从其对应的 BallViewModel 中获取其坐标,并使用它们来确定其在画布内的位置。 球列表绑定到主视图模型中的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>

【问题讨论】:

    标签: wpf mvvm


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 2014-10-14
      • 2015-06-24
      • 1970-01-01
      • 2012-08-15
      • 2011-01-10
      • 2023-03-03
      • 2022-11-16
      • 2014-08-23
      • 1970-01-01
      相关资源
      最近更新 更多