【问题标题】:PropertyChangedCallback not firing when respective property bound to ScrollBar当相应的属性绑定到 ScrollBar 时,PropertyChangedCallback 不会触发
【发布时间】:2015-05-10 07:28:09
【问题描述】:

我有一个相当简单的 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”属性使用以下绑定绑定到 ScrollBar 的“Value”属性:

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

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

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

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

请帮助解决这个问题!

谢谢, --亚历克斯

【问题讨论】:

  • 您可以使用触发器,请查看stackoverflow.com/questions/19620581/…
  • 您的代码确实有效。我添加了带有测试输出的SetImageAngle 方法,它按预期调用。您在此处显示的代码无法重现此问题。
  • Clemens,你是否使用了我的示例代码,有或没有事件方法 scrollBarAngle_ValueChanged(...)?如果我使用它并强制更新 compassControl.Angle 一切正常。如果我注释掉这一行,则不会将更新传播到 compassControl。我可以上传整个项目供您审核 - 它相当小。

标签: c# wpf dependency-properties propertychanged data-binding


【解决方案1】:

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

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多