首页 文章

为什么绑定不适用于目标到源

提问于
浏览
1

我有一个画布,上面有许多动态出现的图像,我使用了物品控制 . 我不得不拖动并旋转(在鼠标右键单击时)这些图像并将新位置和旋转角度更新回源代码(VM和模型) .

我可以在我的屏幕上显示图像,我的canvas.left和canvas.right正在更新源代码中的新位置,当我在画布上拖放图像时 . 问题是当我旋转图像时,图像被旋转但源中的新角度没有在我的源(VModel)中更新,我的意思是当我旋转图像时,这个属性永远不会被调用 .

public double Angle {
            get { return angle; }
            set  //NEVER GETS CALLED ON ROTATION
            {
                angle = value;
                RaisePropertyChanged("Angle");
            }
        }

它是正确绑定的,因为当我在画布上动态显示图像时,它们显示的角度与我从源提供的角度相同 . 早些时候我怀疑Mode没有设置TwoWay绑定 . 即使我设置为TwoWay它也不起作用 . 我还添加了UpdateSourceTrigger = PropertyChanged但仍然无法正常工作 . 为什么在旋转图像时从不更新角度,而更新了canvas.left和canvas.top .

这是我的XAML:

<ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <dd:DragCanvas Height="800" Width="1000" Background="Black" x:Name="dragCanvas" 
                         AllowDragging="True" 
                         />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Image Source="{Binding Path=path}" >
                        </Image>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
                <ItemsControl.ItemContainerStyle>
                    <Style TargetType="ContentPresenter">
                        <Setter Property="Canvas.Left" Value="{Binding Path=Canvas_Left , Mode=TwoWay}" />  //It is updated
                        <Setter Property="Canvas.Top" Value="{Binding Path=Canvas_Top , Mode=TwoWay}" /> //It is Updated
                        <Setter Property="RenderTransform">  //It never updated from target to source but source to target is updated
                            <Setter.Value>
                                <RotateTransform Angle="{Binding Path=Angle ,Mode=TwoWay}"/>
                            </Setter.Value>
                        </Setter>                                
                    </Style>
                </ItemsControl.ItemContainerStyle>
            </ItemsControl>

这是我在鼠标右键单击旋转的地方(内部dd:DragCanvas)

public class DragCanvas : Canvas
    {

       protected override void OnMouseRightButtonUp(MouseButtonEventArgs e)  //HERE IS WHERE I ROTATE by 90 degree
        {
            base.OnMouseRightButtonUp(e);
            ElementBeingDragged = e.Source as UIElement;
            var rotateTransform = ElementBeingDragged.RenderTransform as RotateTransform;
            if (rotateTransform == null)
            {
                rotateTransform = new RotateTransform();
                ElementBeingDragged.RenderTransform = rotateTransform;
                ElementBeingDragged.RenderTransformOrigin = new Point(0.5, 0.5);
            }
            rotateTransform.Angle += 90;
            ElementBeingDragged.UpdateLayout();
        }
    }

如何更新角度属性(目标到源),这样每次我旋转Image我都设置了被调用属性Angle的一部分

public double Angle {
            get { return angle; }
            set  //It must be called when i rotate the image on right mouse click
            {
                angle = value;
                RaisePropertyChanged("Angle");
            }
        }

1 回答

  • 1

    您绑定到 LayoutTransform 但更新 RenderTransform . 计算布局时会应用 LayoutTransform ,而在渲染时会应用 RenderTransform .

    将绑定更改为 RenderTransform ,它应该可以工作 .

    Edit : 刚刚实现切换到使用 RenderTransform 时,需要将变换应用于图像,而不是包装图像的 ContentPresenter .

    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding Path=path}" >
                <Image.ItemContainerStyle>
                    <Style TargetType="ContentPresenter">
                        <Setter Property="RenderTransform">
                            <Setter.Value>
                                <RotateTransform Angle="{Binding Path=Angle ,Mode=TwoWay}"/>
                            </Setter.Value>
                        </Setter>                                
                </Style>
                </Image.Style>
            </Image>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="Canvas.Left" Value="{Binding Path=Canvas_Left , Mode=TwoWay}" />
            <Setter Property="Canvas.Top" Value="{Binding Path=Canvas_Top , Mode=TwoWay}" />                       
        </Style>
    </ItemsControl.ItemContainerStyle>
    

    如果在布局过程中应用变换,它将调整布局中的其他项目以适应 . 因此,将变换应用于在布局期间包装 ImageContentPresenter 也将计算它需要将相同的变换应用于内部 Image .

    但是如果它在渲染期间应用,则只有 ContentPresenter 应用变换并且子 Image 保持不变,因为初始布局传递决定它不需要任何修改 .

相关问题