当使用数据模板DataTemplate的按钮Button时,ListBox项返回字符串。

5

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

我有一个字符串名称的ObservableCollection,它被设置为ListBoxItemsSource。这些名称是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
}

但是返回类型是字符串。

为什么不是按钮?是否有访问按钮的方法?

1个回答

3
编辑: Game_ScrollViewer_online.ItemContainerGenerator.ContainerFromIndex(i)已过时,请阅读此处
请改用Game_ScrollViewer_online.ContainerFromIndex(i),请阅读此处
你需要FrameworkTemplate.FindName 方法 (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;
}

太棒了,它完美地运行了!像你这样提取列表项,然后只使用 FindDescendant 就可以了。更新你的答案,我会标记为已解决 :) - JTIM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接