猿问

当DataTemplate为Button时,ListBox项目返回字符串

我正在创建WP 8.1 Silverlight应用程序。


我有一个ObservableCollection字符串名称,它被设置到的ItemsSource的ListBox。中的按钮名称是哪些ListBox。然后,我想从中提取按钮ListBox,但是返回值为type 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>

然后,我想提取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

}

但是正如所说的,返回类型是字符串。


为什么不是按钮?有没有办法访问按钮?


三国纷争
浏览 388回答 1
1回答

肥皂起泡泡

FrameworkTemplate.FindName Method (String, FrameworkElement)为此,您需要:private childItem FindVisualChild<childItem>(DependencyObject obj)where childItem : DependencyObject{&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DependencyObject child = VisualTreeHelper.GetChild(obj, i);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (child != null && child is childItem)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return (childItem)child;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; childItem childOfChild = FindVisualChild<childItem>(child);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (childOfChild != null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return childOfChild;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return null;}然后:for (int i = 0; i < Game_ScrollViewer_online.Items.Count; i++){&nbsp; &nbsp; &nbsp;ListBoxItem GameListBoxItem = (ListBoxItem)(Game_ScrollViewer_online.ItemContainerGenerator.ContainerFromIndex(i));&nbsp; &nbsp; &nbsp;ContentPresenter contentPresenter = FindVisualChild<ContentPresenter>(GameListBoxItem);&nbsp; &nbsp; &nbsp;DataTemplate myDataTemplate = contentPresenter.ContentTemplate;&nbsp; &nbsp; &nbsp;Button tempBut = (Button) myDataTemplate.FindName("Current_game_button", contentPresenter);&nbsp; &nbsp; &nbsp;//Do stuff with button}要解决这样的缺失FindName用法FindDescendant:public T FindDescendant<T>(DependencyObject obj) where T : DependencyObject{&nbsp; &nbsp; if (obj is T)&nbsp; &nbsp; &nbsp; &nbsp; return obj as T;&nbsp; &nbsp; int childrenCount = VisualTreeHelper.GetChildrenCount(obj);&nbsp; &nbsp; if (childrenCount < 1)&nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; for (int i = 0; i < childrenCount; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; DependencyObject child = VisualTreeHelper.GetChild(obj, i);&nbsp; &nbsp; &nbsp; &nbsp; if (child is T)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return child as T;&nbsp; &nbsp; }&nbsp; &nbsp; for (int i = 0; i < childrenCount; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; DependencyObject child = FindDescendant<T>(VisualTreeHelper.GetChild(obj, i));&nbsp; &nbsp; &nbsp; &nbsp; if (child != null && child is T)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return child as T;&nbsp; &nbsp; }&nbsp; &nbsp; return null;}
随时随地看视频慕课网APP
我要回答