Gli oggetti ListBox restituiscono la stringa, quando DataTemplate è Button

Sto creando un’applicazione WP 8.1 Silverlight.

Ho una ObservableCollection di nomi di stringhe, che è impostata su ItemsSource di un ListBox . Quali sono i nomi dei pulsanti nel ListBox . Quindi voglio estrarre i pulsanti dal ListBox , ma il valore restituito è di tipo string .

Il codice xaml è:

        

Quindi voglio estrarre l’elemento button:

 for (int i = 0; i < Game_ScrollViewer_online.Items.Count; i++) { var tempType = Game_ScrollViewer_online.Items[i].GetType(); Button tempBut = (Game_ScrollViewer_online.Items[i] as Button); //Do stuff with button } 

Ma come detto il tipo di ritorno è una stringa.

Perché non è il pulsante? E c’è un modo per accedere al pulsante?

È necessario il FrameworkTemplate.FindName Method (String, FrameworkElement) per questo scopo:

 private childItem FindVisualChild(DependencyObject obj) where childItem : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is childItem) return (childItem)child; else { childItem childOfChild = FindVisualChild(child); if (childOfChild != null) return childOfChild; } } return null; } 

Poi:

 for (int i = 0; i < Game_ScrollViewer_online.Items.Count; i++) { ListBoxItem GameListBoxItem = (ListBoxItem)(Game_ScrollViewer_online.ItemContainerGenerator.ContainerFromIndex(i)); ContentPresenter contentPresenter = FindVisualChild(GameListBoxItem); DataTemplate myDataTemplate = contentPresenter.ContentTemplate; Button tempBut = (Button) myDataTemplate.FindName("Current_game_button", contentPresenter); //Do stuff with button } 

Per risolvere FindName mancante usa FindDescendant questo modo:

 public T FindDescendant(DependencyObject obj) where T : DependencyObject { if (obj is T) return obj as T; int childrenCount = VisualTreeHelper.GetChildrenCount(obj); if (childrenCount < 1) return null; for (int i = 0; i < childrenCount; i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child is T) return child as T; } for (int i = 0; i < childrenCount; i++) { DependencyObject child = FindDescendant(VisualTreeHelper.GetChild(obj, i)); if (child != null && child is T) return child as T; } return null; }