2017-02-15 46 views
0

简单的问题。有:当ScrollBar最大值发生变化时检测到

<ScrollBar ... /> 

如何检测Maximum何时更改?例如。对于Value有一个event

通常会有某种绑定。我想也许有可能得到这个绑定,创建依赖属性并绑定到它,然后我可以注册一个回调,当这个新的依赖属性被改变......但这听起来很复杂,我相信它是可接受的解决方案所有情况下(例如,如果设置了另一个绑定,我如何检测这种更改)。轮询?

+1

我想创建从滚动条继承了用户控件和重写Maximum属性引发一个事件。 –

+0

@SebastianL,好主意,简单地覆盖['OnMaximumChanged'](https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.rangebase.onmaximumchanged(v = vs.110)。 aspx)升起自定义事件可能会起作用。任何没有自定义控件的解决 – Sinatr

回答

1

您可以创建一个自定义类,如:

public class MScrollBar : System.Windows.Controls.Primitives.ScrollBar 
{ 

    protected override void OnMaximumChanged(double oldMaximum, double newMaximum) 
    { 
     // do stuff 
     base.OnMaximumChanged(oldMaximum, newMaximum); 
    } 
} 

或者

public class MScrollBar : System.Windows.Controls.Primitives.ScrollBar 
{ 
    protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) 
    { 
     if (e.Property == System.Windows.Controls.Primitives.ScrollBar.MaximumProperty) 
     { 
      // do stuff 
     } 
     base.OnPropertyChanged(e); 

    } 
} 
+0

在我的案例中'ScrollBar'已经是控件模板的一部分,所以我不能使用自定义控件(除非重新定义完整的控件模板)。但其他人可能会找到有用的答案,谢谢。 – Sinatr

0

重要的是要了解什么任何属性可以是多个绑定一个。我们可以创建一个新的目标(新的依赖属性),然后在完全能够左右做一个属性的任何变化报告:

  1. 创建回调一个新的依赖项属性。

  2. 将其绑定到任何其他属性以监视更改。

public partial class MainWindow : Window 
{ 
    public double Maximum 
    { 
     get { return (double)GetValue(MaximumProperty); } 
     set { SetValue(MaximumProperty, value); } 
    } 
    public static readonly DependencyProperty MaximumProperty = 
     DependencyProperty.Register("Maximum", typeof(double), typeof(MainWindow), new PropertyMetadata(0, (d, e) => 
     { 
      // value has changed 
     })); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     var scrollBar = ... // instance of scrollbar 
     BindingOperations.SetBinding(this, MaximumProperty, 
      new Binding(nameof(RangeBase.Maximum)) { Source = scrollBar }); 
    } 
} 
相关问题