2016-05-10 8 views
0

ユーザーコントロールのコードビハインドプロパティを、xaml階層の上位にある別のコンポーネントのコードのプロパティにバインドしようとしています。WPF - 背後にある父のコード内の別のプロパティにユーザーコントロールのコードビハインドプロパティをバインドする

IEventAggregatorプロパティのコードウィンドウにメインウィンドウがあります。メインウィンドウにはいくつかのユーザーコントロールが含まれており、ユーザーコントロールのコードの1つからそのプロパティにアクセスしようとしています。

私のxaml階層:メインウィンドウ - >いくつかのディスプレイコントロール - >それぞれのユーザーコントロールを持つタブを持つ別のディスプレイコントロール - >必要なコントロール。

現在の状況では、各タブアイテムにはユーザーコントロールがあり、各ユーザーコントロールのコンストラクターは実行に時間がかかり、アプリケーションが遅延するため、これを実行しようとしています。特定のタブアイテムがクリックされたときにのみユーザーコントロールのコンストラクターを実行して、xamlコードからユーザーコントロールを削除し、タブアイテムのクリックイベントを処理し、そのコードのコンテンツプロパティを変更しました。私が今行う必要があるのは、このコントロールに、代わりにコードから{Binding}で取得していたプロパティを与えることだけです。

私は

答えて

0

:)おかげで、ビジュアルツリーを上る親コントロールを見つけ、そこからプロパティを取得してください..私の質問は十分に明らかであると思います。ユーザーコントロールで

更新#1

... 
      var foundControl = this; 
      while (true) 
      { 
       //get parent item 
       foundControl = foundControl.FindParent<Control>(); 
       if (foundControl == null) break; 
       if (foundControl is IHaveSpecificProperty) 
        break; 
      } 
      var haveSpecificProperty = foundControl as IHaveSpecificProperty; 
      if (haveSpecificProperty == null) return; 
      var specificProperty = haveSpecificProperty.SpecificProperty; 
      //add your logic here 
... 

共通インタフェースコード:

//should be in a common place and both the ParentControl and the ChildControl should have an access to it, 
//in addition your ParentControl should implement this interface 
public interface IHaveSpecificProperty 
{ 
    object SpecificProperty { get; set; } 
} 

ヘルパークラスコード:

public static class VisualTreeHelperExtensions 
{ 
    public static T FindParent<T>(this DependencyObject child) where T : DependencyObject 
    { 
     while (true) 
     { 
      //get parent item 
      DependencyObject parentObject = VisualTreeHelper.GetParent(child); 

      //we've reached the end of the tree 
      if (parentObject == null) return null; 

      //check if the parent matches the type we're looking for 
      T parent = parentObject as T; 
      if (parent != null) 
       return parent; 
      child = parentObject; 
     } 
    } 
} 

よろしくお願いいたします。

+0

私は本当に助けてくれました。私はメインウィンドウに入ることができましたが、まだ小さな問題があります。メインウィンドウは私のアプリケーションを起動する「メイン」プロジェクトの一部ですが、他のすべてのウィンドウとコントロールは「プレゼンテーション」プロジェクトにあり、プレゼンテーションプロジェクトがメインウィンドウを認識するのは間違いですウィンドウを依存オブジェクトから実際のメインウィンドウクラスに移動すると、メインウィンドウの特定のプロパティにアクセスできなくなります。何か案は? –

+0

@DannyIdlis「メイン」と「プレゼンテーション」の両方にアクセスできるインフラストラクチャのような共通のプロジェクトがありますか? – Ilan

+0

@DannyIdlis更新されたバージョンを参照 – Ilan

関連する問題