有没有办法从DataTemplate获取子元素的值? (WP8)

时间:2014-02-26 09:56:31

标签: c# windows-phone-8

例如,我有一个带有自定义DataTemplate的ItemsControl:

<ItemsControl Name="CategoriesList">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

例如,我的集合包含100个元素。我想要检查哪些CheckBoxes,哪些不是,或者我只想更改Content属性。在这两种情况下,我都需要从代码中获取CheckBox元素。所以从代码中获取项目很容易:

var cList = CategoriesList.Items;
foreach (var item in cList)
{
    //Do Something
}

但我需要从这些项目中获取CheckBoxes。有可能吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您需要为同一个

使用可视化树助手

我用列表框尝试过它,它有效! Ant我认为同样适用于ItemsControl,因为列表框和ItemsControl的属性和方法是相同的。

只需制作并使用此方法挖掘列表框的可视树

 public static T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject
        {
            try
            {
                int childCount = VisualTreeHelper.GetChildrenCount(parentElement);
                if (childCount == 0)
                    return null;

                for (int i = 0; i < childCount; i++)
                {
                    var child = VisualTreeHelper.GetChild(parentElement, i);
                    if (child != null && child is T)
                    {
                        return (T)child;
                    }
                    else
                    {
                        var result = FindFirstElementInVisualTree<T>(child);
                        if (result != null)
                            return result;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return null;
        }

这就是你将如何在代码中使用这种方法

                ListBoxItem SelectedListBoxItem = this.lstInstagramTags.ItemContainerGenerator.ContainerFromIndex(int index) as ListBoxItem;
                if (SelectedListBoxItem == null)
                    return;
                // Iterate whole listbox tree and search for this items
                Button btn= FindFirstElementInVisualTree<Button>(SelectedListBoxItem );
                btn.Content="Hello";

还有一个Link

希望这有帮助。