c# – 当DataTemplate为Button时,ListBox项返回字符串
发布时间:2020-12-15 22:23:44 所属栏目:百科 来源:网络整理
导读:我正在创建一个WP 8.1 Silverlight应用程序. 我有一个字符串名称的ObservableCollection,它被设置为ListBox的ItemsSource. ListBox中按钮的名称是什么.然后我想从ListBox中提取按钮,但返回值是string类型. xaml代码是: ListBox x:Name="Game_ScrollViewer_o
我正在创建一个WP 8.1 Silverlight应用程序.
我有一个字符串名称的ObservableCollection,它被设置为ListBox的ItemsSource. ListBox中按钮的名称是什么.然后我想从ListBox中提取按钮,但返回值是string类型. xaml代码是: <ListBox x:Name="Game_ScrollViewer_online" Margin="41,104,128,6" SelectedValuePath="Current_game_button"> <ListBox.ItemTemplate> <DataTemplate> <Button x:Name="Current_game_button" Content="{Binding}" HorizontalAlignment="Center" Height="80" Margin="-14,6,-15,0" VerticalAlignment="Top" Width="210" Template="{StaticResource Button_CurrentLayout1}" RenderTransformOrigin="0.5,0.5" Foreground="#FFCBECCB" FontFamily="Times New Roman" Click="LoadGame_online" FontSize="16"> </Button> </DataTemplate> </ListBox.ItemTemplate> </ListBox> 然后我想要提取按钮元素: 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 } 但正如所说的返回类型是字符串. 为什么不是按钮?有没有办法访问按钮? 解决方法
你需要
FrameworkTemplate.FindName Method (String,?FrameworkElement) 用于此目的:
private childItem FindVisualChild<childItem>(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<childItem>(child); if (childOfChild != null) return childOfChild; } } return null; } 然后: for (int i = 0; i < Game_ScrollViewer_online.Items.Count; i++) { ListBoxItem GameListBoxItem = (ListBoxItem)(Game_ScrollViewer_online.ItemContainerGenerator.ContainerFromIndex(i)); ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(GameListBoxItem); DataTemplate myDataTemplate = contentPresenter.ContentTemplate; Button tempBut = (Button) myDataTemplate.FindName("Current_game_button",contentPresenter); //Do stuff with button } 要解决缺少的FindName,请使用FindDescendant,如下所示: public T FindDescendant<T>(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<T>(VisualTreeHelper.GetChild(obj,i)); if (child != null && child is T) return child as T; } return null; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |