2016-07-08 17 views
0

DependencyPropertyというユーザーコントロールにロジックを追加する必要があります。 私のロジックは、私のUserControl内のコントロールのプロパティを変更するはずです。DependencyPropertyで制御するロジックを追加する

私はたくさんのユーザーコントロールを持っているため、巨大な "依存関係ツリー"の構築を避けたいと考えています。私はちょうど私のウィンドウ(ネストされたユーザーコントロールではない)でバインディングを使用したい。

これは私のコントロールです:

public partial class BucketElevatorControl : UserControl 
{ 
    public BucketElevatorControl() 
    { 
     InitializeComponent(); 
    } 

    public bool On 
    { 
     get 
     { 
      return (bool)GetValue(OnProperty); 
     } 
     set 
     { 
      SetValue(OnProperty, value); 
     } 
    } 

    // Using a DependencyProperty as the backing store for IsOn. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty OnProperty = DependencyProperty.Register(
      "On", 
      typeof(bool), 
      typeof(BucketElevatorControl), 
      new PropertyMetadata(
       false, PropertyChangedCallback 
       )); 



    private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     // I want to do something with my UserControl child controls 
    } 
} 

質問です:どのように私は後ろのcontolコードにいくつかのロジックを行うと、データバインディングを利用することができますか?

私のロジックは複雑です(描画グラフィック、アニメーションなど)。

+1

質問がありますか? – mechanic

+1

不明な質問!簡単な言葉であなたの仕事を一つ一つ書く – AnjumSKhan

答えて

1

変更するプロパティのCoerceValueCallbacksを作成する必要があります。これらのコールバックは新しい値を設定します。

private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 

{ 
    dependencyObject.CoerceValue(MinReadingProperty); 
    dependencyObject.CoerceValue(MaxReadingProperty); 
} 
0

は、私はあなたが、「依存関係ツリー」によって何を意味するかわかりませんが、あなたは変化に応じて、テンプレートで何かの状態を変更する場合:このプロパティの変更は、あなたがして他の人なので、同じように強制するとコントロールの依存関係プロパティでは、TemplateBindingと/またはコントロールテンプレート内のトリガーでこれを行うことができます。必要に応じてvalue convertersと書いてください。あなたがしなければならないことのほとんどは、おそらくそのようにすることができます。

さらに複雑なロジックが必要な場合は、コントロール内でOnApplyTemplate()をオーバーライドし、GetTemplateChild()を呼び出してコントロールのテンプレート内で名前付きコントロールを取得することもできます。たとえば、PART_FooTextという名前のテンプレートをTextBoxのどこかに配置する必要があります。 nullGetTemplateChild("PART_FooText") as TextBoxから取得すると例外がスローされます。 TextBoxがある場合は、イベントの処理、プロパティの設定などを行います。好きな場合は、プライベートフィールドTextBox _PART_FooText;をプロパティ変更コールバックや他のイベントなどで後で試してみてください。

関連する問題