0

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;
    }
  }
}

そして、それを私のアコーディオンに呼び出します:

    foreach (var control in MyAccordion.GetVisuals().OfType<ListBox>())
    {
      // Do something with the listbox 
    }

残念ながら、OfType 拡張メソッドがなくても、拡張メソッド内で GetChildrenCount が呼び出されると、Accordion は 0 を報告します。

アップデート:

次のコードを使用して AccordionItem にアクセスする方法を見つけました

    int selectedIndex = OrganiChartAccordion.SelectedIndex;
    AccordionItem accordionItem = OrganiChartAccordion.ItemContainerGenerator.ContainerFromIndex(selectedIndex) as AccordionItem;

AccordionItem では、DataTemplate を使用してデータをレンダリングしています。DataTemplate には 2 つのリストボックスがあります。選択されたアコーディオン項目のデータ テンプレートと、データ テンプレート内の 2 つのリスト ボックスにアクセスする必要があります。

4

1 に答える 1

2

これを試して:

<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);
                        });
                });
        }
    }
}
于 2012-12-19T09:01:06.420 に答える