2012-06-26 2 views
9

私はオブジェクトの依存関係のプロパティに加えられたすべてのバインディングについて知る必要があるという問題があります。 現在、私はdatacontextが変更され、バインディング式を探すたびに依存関係プロパティを繰り返し処理しています。しかし、私はいくつかのケースでは(TabControls)、データコンテキストが最初に設定されているように見えてから、XAMLからのバインディングが適用されていることがわかりました。プロパティにバインディングが設定されていると起動するイベントはありますか?

私の依存関係プロパティの1つに適用されているバインディングを検出できる方法はありますか?

+0

ためPresentationTraceSourcesに

を使用して、出力ウィンドウ内のバインディングの詳細情報を得ることができます上NotifyOnSourceUpdatedを使用してみてくださいそれ? – MBen

+0

説明が少し複雑ですが、基本的にデータコンテキスト(他のクラスのデータを視覚化するのに役立つヘルパークラス)であるオブジェクトは、このコントロールがオブジェクトに編集されたオブジェクトを編集するためのインターフェイスを提供していることを認識しています。バインディング式のパスに指定されているプロパティ。 – JoshG

答えて

7

あなたは、ユーザーコントロールの内部にあると仮定すると、何をすべきか、あなたはを使用することができるはずですこのイベント。このイベントは、「要素が配置されレンダリングされ、相互作用の準備ができている」ときに起動されます。私はバインディングが完了したということだけを仮定しています。

これで、Loadedイベントハンドラで、あなたがバインドしていることをdatacontextに伝えることができます。

datacontextを変更する予定がある場合は、これをDataContextChangedイベントハンドラと組み合わせる必要があります。

+0

私の質問を理解してくれてありがとう。これは確かに私が探していたものです! 私はちょうどチェックして、あなたの前提は諦めているようです。 ありがとう – JoshG

+2

実際には、要素がビジュアルツリーからロード/アンロードされるたびに、 'Loaded'と' Unloaded'が呼び出され、その要素の存続期間中に何度も発生することがあります(テーマ変更によって要素がリロードされる可能性があります)。 – Grx70

+0

もちろんあなたは正しい@ Grx70です - 私はこの回答を書いた時、未熟で若い人でした;-)私は今、その文を削除しました。 –

-1

プロパティが変更されたときにイベントを発生させることは、INotifyPropertyChangedが行うこととまったく同じです。そこINotifyPropertyChangedのを実装するための1人の必須メンバーだとそれが

サンプルと詳細PropertyChangedイベントである:私は年がここ

がある右の変更のDataContext時に知っておくプライベート静的DataContextChangedイベントを使用して、その年を想定しRaise an event whenever a property's value changed?

+0

私はプロパティがいつ変わるか知りたくありません。バインディングがいつプロパティに接続されたかを知りたい。 あなたのソリューションはこれを行うとは思わない?バインディングを接続することでプロパティが変更されていない可能性があります。つまり値= null、バインディングあり、値はまだnullです。 – JoshG

2

私のコード のいくつかは、これは私が

public static readonly DependencyProperty ApplicationDataContextProperty = 
      DependencyProperty.Register("ApplicationDataContext", 
      typeof(Object), 
      typeof(MyControl), 
      new PropertyMetadata(MyControl_DataContextChanged)); 

// my constructor 

     public MyControl() 
     { 

       InitializeComponent(); 

       if (!DesignerProperties.GetIsInDesignMode(new DependencyObject())) 
       { 
        SetBinding(ApplicationDataContextProperty, new Binding()); 
       } 

     } 

// my event 
     private static void MyControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
     { 

       MyControl thisControl = sender as MyControl 
       if (thisControl != null) 
       { 
        INotifyPropertyChanged propertyChanged; 
        propertyChanged = e.OldValue as INotifyPropertyChanged; 
        if (propertyChanged != null) 
         propertyChanged.PropertyChanged -= thisControl.propertyChanged_PropertyChanged; 


        propertyChanged = e.NewValue as INotifyPropertyChanged; 
        if (propertyChanged != null) 
         propertyChanged.PropertyChanged += thisControl.propertyChanged_PropertyChanged; 
       } 

     } 

// my 2e event 
     void propertyChanged_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 

       if (e.PropertyName == "ListWithUsers") 
        LoadGrid(); 


     } 
+0

ええ、私はDataContextChanged + =イベントハンドラを使用しています。 私はこれをInitializeComponent()の前に、私のコントロールのコンストラクタで行います。 OnDataContextChangedの内部では、バインドされた式が確実にバインドされています(バインディングは視覚的に機能します)。しかし、明らかにまだ割り当てられていない。 – JoshG

+0

データコンテキストを単に変更すると、コントロールが既に初期化されているため、バインディング式は完全に戻ります。 – JoshG

+0

Hmm ...データコンテキストがわかったことがどのように変わったのですが、オブジェクトにバインディングが適用されたことを検出するのに役立ちますか? – JoshG

関連する問題