为什么绑定不适用于目标到源
Why binding do not work for target to source
我有一个 canvas,上面有许多动态显示的图像,我为它使用了项目控件。我不得不拖放并旋转(在鼠标右键单击时)这些图像并更新新位置和旋转角度
到源代码(VM 和模型)。
我可以在我的屏幕上显示图像,当我在 canvas 上拖放图像时,我的 canvas.left 和 canvas.right 正在更新源中的新位置。
问题是当我旋转图像时,图像被旋转但是源中的新角度没有在我的源(VModel)中更新,我的意思是当我旋转图像时这个 属性 永远不会被调用。
public double Angle {
get { return angle; }
set //NEVER GETS CALLED ON ROTATION
{
angle = value;
RaisePropertyChanged("Angle");
}
}
它绑定正确,因为当我在 canvas 上动态显示图像时,它们显示的角度与我从源提供的角度相同。早些时候我怀疑模式没有设置
双向绑定。即使我设置为 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();
}
}
如何更新角度 属性(目标到源),以便每次旋转图像时我都设置了 属性 角度的一部分
public double Angle {
get { return angle; }
set //It must be called when i rotate the image on right mouse click
{
angle = value;
RaisePropertyChanged("Angle");
}
}
您正在绑定到 LayoutTransform
但正在更新 RenderTransform
。 LayoutTransform
在计算布局时应用,而 RenderTransform
在渲染时应用。
将您的绑定更改为 RenderTransform
,它应该可以工作。
编辑: 刚意识到当切换到使用 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>
如果您在布局过程中应用变换,它也会调整布局中的其他项目以适应。因此,在 Layout 期间对包裹 Image
的 ContentPresenter
应用变换也会计算出它需要对内部 Image
应用相同的变换。
但如果在渲染期间应用它,则只有 ContentPresenter
应用变换,而子 Image
保持不变,因为初始布局通道决定它不需要任何修改。
我有一个 canvas,上面有许多动态显示的图像,我为它使用了项目控件。我不得不拖放并旋转(在鼠标右键单击时)这些图像并更新新位置和旋转角度 到源代码(VM 和模型)。
我可以在我的屏幕上显示图像,当我在 canvas 上拖放图像时,我的 canvas.left 和 canvas.right 正在更新源中的新位置。 问题是当我旋转图像时,图像被旋转但是源中的新角度没有在我的源(VModel)中更新,我的意思是当我旋转图像时这个 属性 永远不会被调用。
public double Angle {
get { return angle; }
set //NEVER GETS CALLED ON ROTATION
{
angle = value;
RaisePropertyChanged("Angle");
}
}
它绑定正确,因为当我在 canvas 上动态显示图像时,它们显示的角度与我从源提供的角度相同。早些时候我怀疑模式没有设置 双向绑定。即使我设置为 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();
}
}
如何更新角度 属性(目标到源),以便每次旋转图像时我都设置了 属性 角度的一部分
public double Angle {
get { return angle; }
set //It must be called when i rotate the image on right mouse click
{
angle = value;
RaisePropertyChanged("Angle");
}
}
您正在绑定到 LayoutTransform
但正在更新 RenderTransform
。 LayoutTransform
在计算布局时应用,而 RenderTransform
在渲染时应用。
将您的绑定更改为 RenderTransform
,它应该可以工作。
编辑: 刚意识到当切换到使用 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>
如果您在布局过程中应用变换,它也会调整布局中的其他项目以适应。因此,在 Layout 期间对包裹 Image
的 ContentPresenter
应用变换也会计算出它需要对内部 Image
应用相同的变换。
但如果在渲染期间应用它,则只有 ContentPresenter
应用变换,而子 Image
保持不变,因为初始布局通道决定它不需要任何修改。