2009-03-04 14 views
10

DataTemplateItemtemplateとしたListBoxを作成しました。しかし、SelectedItemのコードビハインドの代わりにUIElementにアクセスする簡単な方法はありますか?WPF ListBox - SelectedItemではなくUIElementを取得

SelectedItemにアクセスすると、 ItemsSourceコレクションから選択したオブジェクトが表示されます。 UIElementにアクセスする方法がありますか(つまり、DataTemplateからバインドされたオブジェクトとともに生成された 要素)?

答えて

11

あなたはItemContainerGeneratorプロパティを探しています。各ItemsSourceにはItemContainerGeneratorのインスタンスがあります。このクラスには興味のある方法があります:ContainerFromItem(object instance)

ListBoxItemへのハンドルがあれば、論理的および視覚的なツリーを参照することができます。 Logical Tree HelperVisual Tree Helperをチェックしてください。

Andyはコメントの中で、あなたのコレクションにアイテムが存在するという理由だけで、コンテナが生成されたというわけではありません。あらゆる種類の仮想化パネルのシナリオがこの問題を引き起こします。 UIElementsは異なるアイテム間で再利用されます。それにも注意してください。

+0

注意、まだ生成されていません。まだUIコンテナがない場合を考慮してください。 – Andy

+0

私はC#とWPFで書いていますが、このプロパティはListBox.ItemsContainerの下に表示されません。このリストボックスのインスタンスを取得するにはどうすればよいですか? – sprite

+0

@size、私の質問の解決策はありますか? http://stackoverflow.com/questions/6148279/record-items-visible-to-user-in-listbox(+250 bounty) – tofutim

4

SIZアンディと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以上の私自身のラッパーです)というそのUIコンテナを意味するものではありません項目がコントロールに追加されているという理由だけで

関連する問題