DataTemplate中RotateTransform Angle的绑定没有生效

本文关键字:绑定 RotateTransform Angle DataTemplate | 更新日期: 2023-09-27 18:09:41

在我的WPF UserControl中我有这个资源,请观察Xml示例中的注释。

<UserControl.Resources>
    <DataTemplate x:Key="AxisXLabelTemplate">
        <ContentPresenter Content="{Binding Path=Content}">
            <ContentPresenter.LayoutTransform>
                <RotateTransform Angle="{Binding XAxisLabelRotation, UpdateSourceTrigger=PropertyChanged}" /> <!-- This does not work -->
                <!-- <RotateTransform Angle="-90" /> This works -->
            </ContentPresenter.LayoutTransform>
        </ContentPresenter>
    </DataTemplate>
</UserControl.Resources>
在代码中,我有一个依赖属性定义如下:
class MyChart: INotifyPropertyChanged
{
        public static readonly DependencyProperty XAxisLabelRotationProperty =
            DependencyProperty.Register("XAxisLabelRotation", typeof(RotateTransform), typeof(BarChart),
                new FrameworkPropertyMetadata((RotateTransform)new RotateTransform(-90.0)));
        public RotateTransform XAxisLabelRotation
        {
            get { return (RotateTransform)GetValue(XAxisLabelRotationProperty); }
            set { SetValue(XAxisLabelRotationProperty, value); }
        }
...
}

AxisXLabelTemplate DataTemplate被分配给一个元素,如下所示:

<chart:AxisLabel ElementTemplate="{StaticResource AxisXLabelTemplate}"/>

问题是,当我使用角度的未绑定值并硬编码为-90时,它工作得很好,而当我尝试将绑定值绑定到XAxisLabelRotation时,它没有。

有人能帮忙吗?

DataTemplate中RotateTransform Angle的绑定没有生效

我重新创建了与您类似的设置,它也不适合我。奇怪的是没有绑定错误。我也做了相对资源绑定,但是没有成功。

虽然如果我绑定tooltip

  <ContentPresenter ToolTip="{Binding XAxisLabelRotation, 
                                      RelativeSource={RelativeSource
                                          AncestorType={x:Type ContentControl}},
                                             UpdateSourceTrigger=PropertyChanged}" ..>

向我显示工具提示。所以我改变了旋转变换

  <RotateTransform Angle="{Binding XAxisLabelRotation, 
                                      RelativeSource={RelativeSource
                                          AncestorType={x:Type ContentControl}},
                                             UpdateSourceTrigger=PropertyChanged}" ..>

但是变换仍然不起作用。仍然没有绑定错误。

然后我引入了一个假转换器…

public class AngleConverter : IValueConverter
{
    public object Convert(...)
    {
        return value;
    }
    ....
}
<RotateTransform Angle="{Binding XAxisLabelRotation, 
                                 RelativeSource={RelativeSource
                                      AncestorType={x:Type ContentControl}},
                                 UpdateSourceTrigger=PropertyChanged,
                                 Converter={StaticResource AngleConverter}}" ..>

竟然奇迹般地起作用了!!

无法解释的WPF世界??

你需要像这样绑定角度:

<RotateTransform Angle="{Binding Path=FontSize, RelativeSource={RelativeSource TemplatedParent}}"/>

DataContext是否正确?如果这个旋转是你之前绑定的Content的一部分,你要么需要改变DataContext,要么将其添加到旋转的绑定路径中,即使其成为{Binding Content.XAxisLabelRotation}

你知道如何调试绑定吗?由于您没有出现任何绑定错误,我认为您没有,所以如果是这种情况,请阅读本文,并确保在将来无法自己调试绑定时提供错误。