WPF ListBox - Erste UIElement anstelle von SelectedItem
-
03-07-2019 - |
Frage
Ich schuf eine ListBox
, dass hat eine DataTemplate
als Itemtemplate
.Allerdings gibt es eine einfache Möglichkeit, die generierten UIElement
anstelle der SelectedItem
in der codebehind?
Wenn ich auf SelectedItem
, Ich bekomme nur das ausgewählte Objekt aus meinem
ItemsSource
collection.Gibt es eine Möglichkeit, den Zugriff auf die UIElement
(dh.die
element erstellt von der DataTemplate
zusammen mit den gebundenen Objekt)?
Lösung
Sie suchen den ItemContainerGenerator Eigenschaft. Jeder ItemsSource
hat eine ItemContainerGenerator Instanz. Diese Klasse hat die folgende Methode, die Sie interessieren könnten: ContainerFromItem (Objektinstanz) .
Wenn Sie einen Griff in die ListBoxItem
haben, können Sie voran gehen und die logische und visuelle Struktur sehen. Schauen Sie sich Logischen Baum Helper und Baumstruktur Helper .
Wie Andy sagte in den Kommentaren, nur weil das Element in Ihrer Sammlung vorhanden ist, bedeutet nicht, ein Container für sie erzeugt wurde. Jede Art von Panel Szenario virtualisieren wird diese Frage aufwerfen; UIElements wird über die verschiedenen Elemente wiederverwendet werden. Seien Sie vorsichtig mit dem auch.
Andere Tipps
siz, Andy und Bodeaker absolut Recht.
Hier ist, wie ich in der Lage war, die zum abrufen der textbox listbox ausgewählte Element mithilfe seiner Griff.
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();
}
(Hinweis:Hier VisualTreeWalker ist meine eigene wrapper über VisualTreeHelper mit verschiedenen nützlichen Funktionen zur Verfügung gestellt)