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

JTI*_*TIM 5 c# wpf xaml listbox windows-phone-8.1

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

我有一个ObservableCollectionof 字符串名称,它设置为ItemsSourceof a ListBox。哪些是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>
Run Code Online (Sandbox Code Playgroud)

然后我想提取按钮元素:

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sal*_*ari 3

编辑:\nGame_ScrollViewer_online.ItemContainerGenerator.ContainerFromIndex(i)不推荐使用,请阅读此处。

\n

Game_ScrollViewer_online.ContainerFromIndex(i)改为使用,请阅读此处

\n
\n

你需要FrameworkTemplate.FindName Method (String,\xe2\x80\x82FrameworkElement)为此,

\n
private childItem FindVisualChild<childItem>(DependencyObject obj)\nwhere childItem : DependencyObject\n{\n        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)\n        {\n            DependencyObject child = VisualTreeHelper.GetChild(obj, i);\n            if (child != null && child is childItem)\n                return (childItem)child;\n            else\n            {\n                childItem childOfChild = FindVisualChild<childItem>(child);\n                if (childOfChild != null)\n                    return childOfChild;\n            }\n        }\n        return null;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后:

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

解决漏FindName用的问题FindDescendant如下所示:

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