Silverlight手风琴。如何缩小数据绑定集合的内容

时间:2012-02-06 12:49:03

标签: silverlight c#-4.0 silverlight-toolkit silverlight-5.0

我有一个与ObservableCollection绑定的Accordion。我需要应用变通方法让Accordion将其子项调整为内容(即如果项目已从绑定集合中删除,我需要手风琴缩小,如果添加,则扩展)。

然而,我找到的所有解决方法都使用了AccordionItem对象。它们都在XAML中设置了AccordionItem项,因此它们的accordion.Items是AccordionItem对象的集合。

虽然我绑定到myObject,但它们被放置在ItemContainerStyleTemplate中的AccordionItem对象中。我唯一需要的是以某种方式访问​​AccordionItem。如果我尝试像accordion.Items [0] .GetType()那样返回myObject。

所以问题是 - 如何从数据绑定的Accordion访问AccordionItem对象?

我想尝试的解决方法:(编辑:它确实可以正常工作)

    public static void UpdateSize(this AccordionItem item)
    {
        item.Dispatcher.BeginInvoke(
        delegate
        {
            if (!item.IsLocked && item.IsSelected)
            {
                item.IsSelected = false;
                item.InvokeOnLayoutUpdated(delegate { item.IsSelected = true; });
            }
        });
    }

1 个答案:

答案 0 :(得分:2)

我必须对Accordions做类似的事情,而我能够进入AccordionItems的唯一方法就是走在视觉树上。

我是这样做的:给定这些扩展方法:

public static IEnumerable<DependencyObject> GetAllChildrenOfType(this DependencyObject depObject, Type t, bool recursive = true)
{
    List<DependencyObject> objList = new List<DependencyObject>();

    var childrenList = depObject.GetChildren();

    foreach (DependencyObject i in childrenList)
    {
        Type ct = i.GetType();
        if (ct == t)
            objList.Add(i);

            if (recursive)
                objList.AddRange(i.GetAllChildrenOfType(t));
    }
    return objList.ToArray();
}

public static IEnumerable<DependencyObject> GetChildren(this DependencyObject depObject)
{
     int count = depObject.GetChildrenCount();
     for (int i = 0; i < count; i++)
     {
         yield return VisualTreeHelper.GetChild(depObject, i);
     }
}

现在你可以在给定的手风琴中获得所有的AccordionItem:

var accordionItemList = myAccordion.GetAllChildrenOfType(typeof(AccordionItem));

foreach (AccordionItem i in accordionItemList)
{...}

这可能比需要的要复杂一些,在我的手风琴中有手风琴,最终使事情变得困难。