Wpf 为什么目标到源的绑定不起作用
我有一个画布,它有许多动态显示的图像,我使用了items控件。我必须拖放和旋转(鼠标右键点击)这些图像,并更新新的位置和旋转角度回来 到源代码(VM和模型) 我可以在屏幕上显示图像和canvas.left和canvas.right,当我在画布上拖放图像时,它们会更新源中的新位置。 问题是,当我旋转图像时,图像会旋转,但源中的新角度不会在我的源(VModel)中更新,我的意思是,当我旋转图像时,永远不会调用此属性Wpf 为什么目标到源的绑定不起作用,wpf,mvvm,rotation,rotatetransform,updatesourcetrigger,Wpf,Mvvm,Rotation,Rotatetransform,Updatesourcetrigger,我有一个画布,它有许多动态显示的图像,我使用了items控件。我必须拖放和旋转(鼠标右键点击)这些图像,并更新新的位置和旋转角度回来 到源代码(VM和模型) 我可以在屏幕上显示图像和canvas.left和canvas.right,当我在画布上拖放图像时,它们会更新源中的新位置。 问题是,当我旋转图像时,图像会旋转,但源中的新角度不会在我的源(VModel)中更新,我的意思是,当我旋转图像时,永远不会调用此属性 public double Angle { get { r
public double Angle {
get { return angle; }
set //NEVER GETS CALLED ON ROTATION
{
angle = value;
RaisePropertyChanged("Angle");
}
}
<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>
它是正确绑定的,因为当我在画布上动态显示图像时,它们的显示角度与我从源代码中提供的角度相同。早些时候我怀疑模式没有设置
双向装订。即使我设置为双向,它也不起作用。我还添加了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>
如何更新角度属性(从目标到源),这样每次旋转图像时,我都会设置一部分属性角度,称为
public double Angle {
get { return angle; }
set //It must be called when i rotate the image on right mouse click
{
angle = value;
RaisePropertyChanged("Angle");
}
}
您正在绑定到
layoututtransform
,但正在更新RenderTransform
<代码>布局转换在计算布局时应用,而渲染转换
在渲染时应用
将绑定更改为RenderTransform
,它应该可以工作
编辑:当切换到使用渲染转换时,您需要将转换应用于图像,而不是内容演示者
包装图像
public double Angle {
get { return angle; }
set //NEVER GETS CALLED ON ROTATION
{
angle = value;
RaisePropertyChanged("Angle");
}
}
<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>
如果在布局过程中应用转换,它也会调整布局中的其他项目以适应。因此,在布局过程中,将变换应用于包装图像的ContentPresenter
,也会计算出它需要将相同的变换应用于内部图像
但是如果在渲染期间应用它,只有ContentPresenter
应用了变换,并且子图像
保持不变,因为初始布局过程决定它不需要任何修改。你是说RotateTransform.Angle
从不更新viewmodelAngle
属性吗,通过公开支持字段而不在其前面加下划线,您为自己设置了陷阱。在intellisense的帮助下,总有一天你会给canvas\u Top
赋值,并想知道为什么PropertyChanged
从未被提升。你绑定到LayoutTransform
但更新RenderTransform
layoututtransform
在计算布局时应用,而RenderTransform
在渲染时应用。注意,您不必调用elementbeingdraugd.UpdateLayout()
。这完全是多余的。@EdPlunkett是的,他的意思是一样的。但Stuckstack也说他的绑定是单向的(模式)。他说,当他第一次启动应用程序时,他在画布上以他通过source提供的相同角度显示图像。你认为ninding和LayoutTransform会在源到目标而不是目标到源上工作吗?@Rachel你的意思是“这应该是”?但是,当我提供从源到目标的角度时,为什么它在这种情况下有效呢。它显示源提供的角度上的图像,但当我旋转图像时,它不会更新回VM关于角度更改的信息。@stuckstuck这两个属性都用于变换对象的角度,但它们具有不同的计时。例如,如果您将文本放置在调整大小以适合其子级的StackPanel中,它将像普通一样显示。如果应用LayoutTransform垂直绘制文本,还将更改其周围StackPanel的大小以匹配垂直文本。但是,如果使用RenderTransform,StackPanel将被绘制为正常的水平文本,但是文本本身将被垂直绘制(并且在StackPanel的边界之外)。@StuckStick但在您的情况下,您使用的是两个单独的属性。在布局计算和初始显示过程中,将使用绑定值。但在渲染过程中,它使用的是用户应用的值。将您的绑定更改为使用RenderTransform,它将按预期工作。@Rachel谢谢。。我现在在外面,我会在明天应用你的解决方案,一旦有效,我会将你标记为答案。否则会再次打扰您:)