【问题标题】:Is there a way to get values of child elements from DataTemplate? (WP8)有没有办法从 DataTemplate 获取子元素的值? (WP8)
【发布时间】:2014-02-26 09:56:31
【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

  • 您可以使用 Aman Khandelwal 的解决方案,但我认为它过于复杂。通过属性类型 bool MyIsChecked 和绑定复选框 IsChecked 属性更容易扩展集合中的对象。&lt;CheckBox Content="{Binding MyContent}" IsChecked="{Binding MyIsChecked}"/&gt;

标签: c# windows-phone-8


【解决方案1】:

您需要为此使用可视化树助手

我已经用列表框尝试过它并且它有效! 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

希望这会有所帮助。

【讨论】:

  • 我将我的 ItemsControl 更改为 ListBox,因为它对我来说并不重要。但该方法不起作用。它返回“Reference is a not a valid visual DependencyObject”
  • 抱歉,已经修复。 =) 非常感谢!这是我真正需要的,因为它能够解决我的应用程序中的许多问题。 =)
  • 发现了奇怪的行为。如果ContainerFromIndex 中的索引大于 19,则返回“Reference is a not a valid visual DependencyObject”。实际上我的 ListBox 包括 74 个项目。有什么问题?
  • 实际上它与 ContainerFromIndex 在大于 19 的索引处返回 null 的事实有关(至少在我的情况下)。我不知道为什么。
  • 尝试将其放入 Dispatcher.BeginInvoke 方法中。那可以解决问题。虽然我不确定。
猜你喜欢
  • 2015-01-06
  • 1970-01-01
  • 2011-10-20
  • 2013-08-20
  • 1970-01-01
  • 2011-07-31
  • 2012-06-02
  • 2019-09-28
  • 2012-03-09
相关资源
最近更新 更多