У меня есть довольно простой 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;
}
Пожалуйста, помогите решить эту проблему!
Спасибо, - Алексей
SetImageAngle
с тестовым выводом, и он вызывается должным образом. Проблема не может быть воспроизведена с помощью кода, который вы здесь показываете. - person Clemens   schedule 09.03.2015