如何从ViewModel移动椭圆

时间:2016-02-24 03:55:44

标签: c# wpf canvas data-binding ellipse

我正在创建一个WPF应用程序,我必须将一个集合绑定到Canvas,然后,每个元素都显示为一个椭圆。因此,由于我希望能够按需移动所有元素,因此我将每个元素的viewmodel绑定到Canvas.LeftCanvas.Top。但是,当我为viewmodel的绑定属性分配一个新值时,椭圆不会移动。

我的xaml文件:

<ItemsControl ItemsSource="{Binding Elements}">                   
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Viewbox >
            <Grid>
                <Ellipse Stroke="Black" 
                         Width="{Binding ShapeWidth, Mode=TwoWay}" 
                         Height="{Binding ShapeHeight, Mode=TwoWay}" 
                         Canvas.Left="{Binding ShapeCanvasLeft, Mode=TwoWay}"
                         Canvas.Top="{Binding ShapeCanvasTop, Mode=TwoWay}"
                         Fill="{Binding Background}"
                         />                
                <TextBlock Text="{Binding ElementName}"
                           HorizontalAlignment="Center"  
                           TextAlignment="Center" 
                           VerticalAlignment="Center"
                           />
            </Grid>
        </Viewbox>
    </DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <Canvas />
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

我的viewmodel文件:

public double ShapeCanvasLeft
{
    get
    {
        return m_shapeCanvasLeft;
    }
    set
    {
        m_shapeCanvasLeft = value;
        OnPropertyChanged(nameof(ShapeCanvasLeft));
    }
}

public double ShapeCanvasTop
{
    get
    {
        return m_shapeCanvasTop;
    }
    set
    {
        m_shapeCanvasTop = value;
        OnPropertyChanged(nameof(ShapeCanvasTop));
    }
}
. . .

然后在其他地方:

ShapeCanvasTop = 100; // This does not work

那么,我做错了什么?但是,形状不会移动,属性ShapeHeightShapeWidth可以正常工作,即形状可以正确调整大小。

提前致谢。

1 个答案:

答案 0 :(得分:1)

ItemsControl项目被包装在父容器中,这就是你需要设置的位置:

<ItemsControl.ItemContainerStyle>
    <Style>
        <Setter Property="Canvas.Left" Value="{Binding ShapeCanvasLeft}" />
        <Setter Property="Canvas.Top" Value="{Binding ShapeCanvasTop}" />
    </Style>
</ItemsControl.ItemContainerStyle>