【发布时间】: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