PropertyChangedCallback не срабатывает, когда соответствующее свойство привязано к ScrollBar

У меня есть довольно простой 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>

Свойство Text элемента TextBox и свойство Angle элемента управления привязаны к свойству Value элемента ScrollBar с помощью следующей привязки:

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

Когда я прокручиваю полосу прокрутки, текстовое поле обновляется, как ожидалось, но угол не меняется - обратный вызов OnAngleChanged не вызывается!

Однако, если я напрямую изменяю свойство Angle в событии ValueChanged ScrollBar, все работает нормально - свойство было изменено и соответствующий обратный вызов запущен:

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

Пожалуйста, помогите решить эту проблему!

Спасибо, - Алексей


person Alex Zarenin    schedule 09.03.2015    source источник
comment
вы можете использовать для этого триггеры, пожалуйста, посмотрите stackoverflow .com / questions / 19620581 /   -  person Dhaval Patel    schedule 09.03.2015
comment
Ваш код действительно работает. Я добавил метод SetImageAngle с тестовым выводом, и он вызывается должным образом. Проблема не может быть воспроизведена с помощью кода, который вы здесь показываете.   -  person Clemens    schedule 09.03.2015
comment
Клеменс, вы использовали мой пример кода с методом события ‹code› scrollBarAngle_ValueChanged (...) ‹code› или без него? Если я использую его и принудительно обновляю compassControl.Angle, все работает нормально. Если я закомментирую эту строку, на compassControl не будут распространяться никакие обновления. Могу выложить для ознакомления весь проект - он небольшой.   -  person Alex Zarenin    schedule 09.03.2015


Ответы (1)


Приношу свои извинения - проблема была не в коде, а в среде! У меня было открыто несколько экземпляров VS2013, в двух из них был открыт проект. В любом случае, после прочтения комментария Клеменса, указывающего на то, что моя проблема не воспроизводится, я закрыл все экземпляры VS, затем запустил новый экземпляр, открыл проект - и все сработало нормально!

Спасибо!

person Alex Zarenin    schedule 09.03.2015