WPF ListBox-SelectedItemの代わりにUIElementを取得
-
03-07-2019 - |
質問
Itemtemplate
として DataTemplate
を持つ ListBox
を作成しました。ただし、コードビハインドの SelectedItem
ではなく、生成された UIElement
にアクセスする簡単な方法はありますか?
SelectedItem
にアクセスすると、選択したオブジェクトが
ItemsSource
コレクション。 UIElement
にアクセスする方法はありますか(つまり、
DataTemplate
からバインドされたオブジェクトとともに生成された要素)?
解決
ItemContainerGenerator プロパティ。各 ItemsSource
には ItemContainerGeneratorがありますインスタンス。このクラスには、興味のある次のメソッドがあります。 ContainerFromItem(object instance)。
ListBoxItem
へのハンドルを取得したら、先に進んで論理ツリーと視覚ツリーを参照できます。 論理ツリーヘルパーおよびビジュアルツリーヘルパー。
Andyがコメントで言ったように、アイテムがコレクションに存在するからといって、そのためにコンテナが生成されたわけではありません。あらゆる種類の仮想化パネルシナリオでこの問題が発生します。 UIElementはさまざまなアイテムで再利用されます。それにも注意してください。
他のヒント
siz 、 Andy および Bodeaker は完全に正しいです。
これは、ハンドルを使用してリストボックスの選択された項目のテキストボックスを取得する方法です。
var container = listboxSaveList.ItemContainerGenerator.ContainerFromItem(listboxSaveList.SelectedItem) as FrameworkElement;
if (container != null)
{
ContentPresenter queueListBoxItemCP = VisualTreeWalker.FindVisualChild<ContentPresenter>(container);
if (queueListBoxItemCP == null)
return;
DataTemplate dataTemplate = queueListBoxItemCP.ContentTemplate;
TextBox tbxTitle = (TextBox)dataTemplate.FindName("tbxTitle", queueListBoxItemCP);
tbxTitle.Focus();
}
(注:ここでは、VisualTreeWalkerはVisualTreeHelperの独自のラッパーであり、さまざまな便利な機能が公開されています)