2017-02-15 14 views
0

簡単な質問。持っている:ScrollBarの最大値が変更されたときの検出

<ScrollBar ... /> 

Maximumが変更されたときはどうすれば検出できますか?例えば。 Valueにはeventがあります。

通常、何らかの種類のバインディングがあります。このバインディングを取得し、依存関係プロパティを作成し、代わりにバインドすることが可能かもしれないと考えていましたが、この新しい依存プロパティが変更されたときにコールバックを登録できます...しかし、それは複雑ではありません。すべての場合(たとえば、別のバインディングが設定されている場合はどうすればこのような変更を検出できますか)ポーリング?

+1

iはScrollBarから継承されたユーザーコントロールを作成し、イベントを発生させる最大プロパティをオーバーライドしたいです。 –

+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 }); 
    } 
} 
関連する問題