質問

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の独自のラッパーであり、さまざまな便利な機能が公開されています)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top