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 つのリスト ボックスにアクセスする必要があります。