Silverlight 如何通过编程访问手风琴的手风琴项目?

Silverlight 如何通过编程访问手风琴的手风琴项目?,silverlight,silverlight-toolkit,Silverlight,Silverlight Toolkit,我在silverlight应用程序中使用手风琴。在手风琴项目中,我有一个列表框,我需要访问扩展的手风琴项目和手风琴的这个列表框 我很难找到访问accordionitem及其所包含的列表框的方法。我该怎么做 我试图解决的是使用以下扩展类: public static IEnumerable<DependencyObject> GetVisuals(this DependencyObject root) { int count = VisualTreeHelper.GetChildr

我在silverlight应用程序中使用手风琴。在手风琴项目中,我有一个列表框,我需要访问扩展的手风琴项目和手风琴的这个列表框

我很难找到访问accordionitem及其所包含的列表框的方法。我该怎么做

我试图解决的是使用以下扩展类:

public static IEnumerable<DependencyObject> GetVisuals(this DependencyObject root)
{
  int count = VisualTreeHelper.GetChildrenCount(root);
  for (int i = 0; i < count; i++)
  {
    var child = VisualTreeHelper.GetChild(root, i);
    yield return child;
    foreach (var descendants in child.GetVisuals())
    {
      yield return descendants;
    }
  }
}
在AccordionItem中,我使用DataTemplate来呈现数据。在DataTemplate中,我有两个列表框。我需要访问选定的accordionitem中的数据模板,以及datatemplate中的两个列表框

试试这个:

<UserControl x:Class="SilverlightApplication10.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:layout="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Layout.Toolkit"
             mc:Ignorable="d"
             d:DesignHeight="300"
             d:DesignWidth="400">

    <Grid x:Name="LayoutRoot"
          Background="White">
        <layout:Accordion x:Name="Accordion1">
            <layout:Accordion.Items>
                <layout:AccordionItem Header="Header 1">
                    <ListBox>
                        <ListBox.Items>
                            <ListBoxItem Content="Item 1"></ListBoxItem>
                            <ListBoxItem Content="Item 2"></ListBoxItem>
                            <ListBoxItem Content="Item 3"></ListBoxItem>
                        </ListBox.Items>
                    </ListBox>
                </layout:AccordionItem>
                <layout:AccordionItem Header="Header 2">
                    <ListBox>
                        <ListBox.Items>
                            <ListBoxItem Content="Item 1"></ListBoxItem>
                            <ListBoxItem Content="Item 2"></ListBoxItem>
                            <ListBoxItem Content="Item 3"></ListBoxItem>
                        </ListBox.Items>
                    </ListBox>
                </layout:AccordionItem>
            </layout:Accordion.Items>
        </layout:Accordion>
    </Grid>
</UserControl>

谢谢你的回答。就我而言,这有点困难。我使用容器样式来设置accordionitem的样式,它有一个控件。当我试图将项强制转换到该控件时,出于某种原因,它返回null。我可能需要重新表述我的问题,因为它不能很好地解释我的问题。很抱歉:)没问题,只需发布更多代码,我会看看是否能提供帮助。我更新了我的问题,并提供了更多详细信息。在我的手风琴项目中,我不是直接放置listbox控件,而是在DataTemplate中定义它们。我的问题是访问数据模板及其内容-我的列表框!好吧,我想我明白你的意思了。问题是,您到底想对列表框做什么?例如,如果要检查这些列表框中选择的内容,可能有更好的方法,例如将列表框的SelectedItem绑定到数据对象上的属性。然后您可以在数据对象上检查该属性。如果你能添加一些关于你正在努力实现的目标的信息,那么就更容易为你指明正确的方向。
    int selectedIndex = OrganiChartAccordion.SelectedIndex;
    AccordionItem accordionItem = OrganiChartAccordion.ItemContainerGenerator.ContainerFromIndex(selectedIndex) as AccordionItem;
<UserControl x:Class="SilverlightApplication10.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:layout="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Layout.Toolkit"
             mc:Ignorable="d"
             d:DesignHeight="300"
             d:DesignWidth="400">

    <Grid x:Name="LayoutRoot"
          Background="White">
        <layout:Accordion x:Name="Accordion1">
            <layout:Accordion.Items>
                <layout:AccordionItem Header="Header 1">
                    <ListBox>
                        <ListBox.Items>
                            <ListBoxItem Content="Item 1"></ListBoxItem>
                            <ListBoxItem Content="Item 2"></ListBoxItem>
                            <ListBoxItem Content="Item 3"></ListBoxItem>
                        </ListBox.Items>
                    </ListBox>
                </layout:AccordionItem>
                <layout:AccordionItem Header="Header 2">
                    <ListBox>
                        <ListBox.Items>
                            <ListBoxItem Content="Item 1"></ListBoxItem>
                            <ListBoxItem Content="Item 2"></ListBoxItem>
                            <ListBoxItem Content="Item 3"></ListBoxItem>
                        </ListBox.Items>
                    </ListBox>
                </layout:AccordionItem>
            </layout:Accordion.Items>
        </layout:Accordion>
    </Grid>
</UserControl>
using System;
using System.Diagnostics;
using System.Linq;
using System.Windows;
using System.Windows.Controls;

namespace SilverlightApplication10
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            this.Loaded += MainPage_Loaded;
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            Accordion1.Items.ToList().ForEach(item =>
                {
                    ((item as AccordionItem).Content as ListBox).Items.ToList().ForEach(listBoxItem =>
                        {
                            var content = ((ListBoxItem)listBoxItem).Content;

                            Debug.WriteLine(content);
                        });
                });
        }
    }
}