Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 为什么目标到源的绑定不起作用_Wpf_Mvvm_Rotation_Rotatetransform_Updatesourcetrigger - Fatal编程技术网

Wpf 为什么目标到源的绑定不起作用

Wpf 为什么目标到源的绑定不起作用,wpf,mvvm,rotation,rotatetransform,updatesourcetrigger,Wpf,Mvvm,Rotation,Rotatetransform,Updatesourcetrigger,我有一个画布,它有许多动态显示的图像,我使用了items控件。我必须拖放和旋转(鼠标右键点击)这些图像,并更新新的位置和旋转角度回来 到源代码(VM和模型) 我可以在屏幕上显示图像和canvas.left和canvas.right,当我在画布上拖放图像时,它们会更新源中的新位置。 问题是,当我旋转图像时,图像会旋转,但源中的新角度不会在我的源(VModel)中更新,我的意思是,当我旋转图像时,永远不会调用此属性 public double Angle { get { r

我有一个画布,它有许多动态显示的图像,我使用了items控件。我必须拖放和旋转(鼠标右键点击)这些图像,并更新新的位置和旋转角度回来 到源代码(VM和模型)

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

 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
从不更新viewmodel
Angle
属性吗,通过公开支持字段而不在其前面加下划线,您为自己设置了陷阱。在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谢谢。。我现在在外面,我会在明天应用你的解决方案,一旦有效,我会将你标记为答案。否则会再次打扰您:)