2011-12-19 4 views
0

スタックパネルのdragOverイベントは、スタックパネルを送信者としてアクセスできますが、スタックパネルがあるリストボックスの名前を取得するにはどうすればいいですか(スタックパネルはデータ型で定義されています)。この理由は、最終的には、データ・テンプレートによって生成されたリスト内の他のすべてのスタックパネルにアクセスすることです。ここで間違ったツリーを作成すると、他のスタックパネルにアクセスする別の方法があります。ありがとう、スタックパネルが入っているリストボックスの名前はどのようにして取得できますか?

ダン。

答えて

2

更新(作業)答え

をあなたがStackPanelVisualTreeHelper.GetParentvisual treeを歩く必要があり、 ListBox(見つかったことを検出するためにasまたはis演算子を使用)が見つかるまで、必要に応じてさらに親以上に再帰します。

追加の利便性のため、または他の方向(もう少し複雑です)でツリーをトラバースする必要がある場合は、トラバースをthis oneなどのLINQy形式で公開するラッパーを使用できます。

これらはすべて、How can I find WPF controls by name or type?をご覧ください。

+0

ありがとうJon、私はこれらを見て、親のプロパティのソリューションは私のために働いていないようです。 –

+0

@DanielMcNulty:申し訳ありませんが、私はそれを忘れていました...錆びています。更新された答えを見て、あなたは* visual *ツリーを歩く必要があります。 – Jon

+0

完璧なジョン!そこに私の髪を引っ張ってしまう問題を解決しました。ありがとう。 –

1

現在のオブジェクトがでホストされているオブジェクトを取得するには.Parentプロパティを使用します。

+0

お返事ありがとうございます - 親のプロパティはnull thoです!私が境界コントロール内のスタックパネルをラップすると、親プロパティは境界線を表示しましたが、スタックパネルがデータシートの 'ルート'コントロールであるため、それを取り除くとnullになります - したがって、データテンプレートの?ありがとう。 –

+0

その後、次のようなJonのアプローチが次の方法になります。 –

1
var listboxName = (stackpanel.Parent as ListBox).Name; 
+0

お返事ありがとうございます - 親のプロパティはnull thoです!私が境界コントロール内のスタックパネルをラップすると、親プロパティは境界線を表示しましたが、スタックパネルがデータシートの 'ルート'コントロールであるため、それを取り除くとnullになります - したがって、データテンプレートの?ありがとう。 –

1

thisによるとStackPanelのは、それがテンプレート内に位置しているとして、Parentプロパティによって論理ツリーのルートに到達するので、TemplatedParentプロパティを使用しません。その中にListBoxItemがあります。ListBoxItemはその親としてlistboxを持っています。

関連する問題