属性更改回调在各自的属性绑定到滚动条时不触发

本文关键字:属性 滚动条 绑定 回调 | 更新日期: 2024-11-05 15:46:24

我有一个相当简单的UserControl,我想用DependencyProperty进行扩展。该控件的相关代码如下:

    public partial class CompassControl : UserControl
    {
    public static readonly DependencyProperty AngleProperty =
        DependencyProperty.Register("Angle", typeof(Double), typeof(CompassControl),
                new FrameworkPropertyMetadata(  0.0, FrameworkPropertyMetadataOptions.AffectsRender,
                                        new PropertyChangedCallback(OnAngleChanged)));
    private static void OnAngleChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) 
        {
        ((CompassControl)target).SetImageAngle((Double)e.NewValue);
        }
    public CompassControl( )
        {
        InitializeComponent( );
        }
    public Double Angle
        {
        get { return (Double)GetValue(AngleProperty); }
        set { SetValue(AngleProperty, value); }
        }

此控件用于简单窗体;相关的 XAML 如下所示:

        <DockPanel DockPanel.Dock="Bottom">
        <DockPanel>
            <TextBlock DockPanel.Dock="Left"
                       TextAlignment="Center" FontWeight="Bold" FontSize="12"          
                       Padding="0,4,0,0" HorizontalAlignment="Left" 
                       Height="22" Width="60" Margin="10,0,0,0" 
                       Text="{Binding ElementName=scrollBarAngle, Path=Value}">
            </TextBlock>
            <ScrollBar DockPanel.Dock="Left" Name="scrollBarAngle" Orientation="Horizontal" 
                       Height="22" Margin="10,0"
                       Maximum="360.0" Minimum="0.0" SmallChange="1.0" Value="0.0"
                       ValueChanged="scrollBarAngle_ValueChanged" />
        </DockPanel>
    </DockPanel>
    <ctl:CompassControl DockPanel.Dock="Top" Name="compassControl" 
                        Margin="5" Width="Auto" Height="Auto" 
                        Angle="{Binding ElementName=scrollBarAngle, Path=Value}"
                        />
</DockPanel>
TextBox 的"Text"属性

和我的控件的"Angle"属性使用以下绑定绑定到滚动条的"Value"属性:

"{Binding ElementName=scrollBarAngle, Path=Value}"

当我滚动滚动条时,文本字段按预期更新,但角度没有改变 - 没有调用 OnAngleChanged 回调!

但是,如果我直接更改滚动条的 ValueChanged 事件中的 Angle 属性,一切正常 - 属性已更改并触发了相应的回调:

        private void scrollBarAngle_ValueChanged( object sender, RoutedPropertyChangedEventArgs<double> e )
        {
        compassControl.Angle = e.NewValue;
        }

请帮助解决此问题!

谢谢--亚历克斯

属性更改回调在各自的属性绑定到滚动条时不触发

我很抱歉 - 问题不在于代码,而在于环境!我打开了几份VS2013副本,该项目在其中两份中打开。无论如何,在阅读了 Clemens 的评论表明我的问题不可重现后,我关闭了 VS 的所有实例,然后启动了新实例,打开了项目 - 一切正常!

谢谢!