2009-03-04 18 views
10

DataTemplateItemtemplate olan bir ListBox oluşturdum. Ancak, codebehind içinde SelectedItem yerine oluşturulan UIElement erişmek için kolay bir yolu var mı?WPF ListBox - SelectedItem yerine UIElement alma

SelectedItem'a eriştiğimde, seçili nesneyi yalnızca ItemsSource koleksiyonundan aldım. UIElement (yani, DataTemplate ile ilişkili nesne ile birlikte oluşturulan öğeye erişmenin) bir yolu var mı?

cevap

11

ItemContainerGenerator özelliğine bakıyorsunuz. Her bir ItemsSource, bir ItemContainerGenerator örneğine sahiptir. Bu sınıf, ilginizi çekebilecek aşağıdaki yönteme sahiptir: ContainerFromItem(object instance).

ListBoxItem'un bir tanıtıcılığına sahip olduğunuzda, devam edip mantıksal ve görsel ağaca göz atabilirsiniz. Logical Tree Helper ve Visual Tree Helper'a bakın.

Andy'nin söylediği gibi, koleksiyonunuzda bulunan öğe için bunun için bir kap oluşturulduğu anlamına gelmez. Her türlü sanallaştırma paneli senaryosu bu sorunu gündeme getirecektir; UIElements farklı öğeler arasında yeniden kullanılacaktır. Bununla da dikkatli ol.

+0

Not, anlamına gelmez onun UI konteyner henüz oluşturuldu. Henüz bir UI kabı bulunmadığı durumun dikkate alındığından emin olun. – Andy

+0

Ben C# ve WPF yazıyorum ve bu özellik ListBox.ItemsContainer altında görünmüyor Bu liste kutusu için örnek nasıl alabilirim? – sprite

+0

@size, sorumu için bir çözüm var mı? http://stackoverflow.com/questions/6148279/record-items-visible-to-user-in-listbox (+250 lütuf) – tofutim

4

siz,Andy ve Bodeaker haklısınız.

Listbox'ın seçili öğesinin metin kutusunu tanıtıcısını kullanarak nasıl alabildim.

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(); 
} 

(Not: Burada VisualTreeWalker maruz çeşitli kullanışlı fonksiyonları ile VisualTreeHelper üzerinde kendi sarıcı) bir öğe kontrolü eklendi sırf