Серебряный Аккордеон. Как сжать содержимое в коллекции данных - PullRequest
0 голосов
/ 06 февраля 2012

У меня есть Аккордеон, который привязан к ObservableCollection.Мне нужно применить обходной путь, чтобы Аккордеон изменил размеры своих дочерних элементов к контенту (т. Е. Если элемент был удален из связанной коллекции, мне нужно, чтобы аккордеон уменьшился, а при добавлении - расширился).

Однако всеОбходной путь, который я нашел, использует объекты AccordionItem.Все они имеют элементы AccordionItem, установленные в XAML, поэтому их accordion.Items являются коллекциями объектов AccordionItem.

Несмотря на то, что я связываюсь с myObject, они помещаются в объект AccordionItem в ItemContainerStyleTemplate.Единственное, что мне нужно, это как-то получить доступ к этому AccordionItem.Если я пытаюсь что-то вроде accordion.Items [0] .GetType (), он возвращает myObject.

Так что вопрос - как мне получить доступ к объекту AccordionItem из привязанного к данным Accordion?

Обходной путь, который я хотел попробовать: (РЕДАКТИРОВАТЬ: он работает так, как мне нужно)

    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 Ответ

2 голосов
/ 06 февраля 2012

Мне приходилось делать то же самое с Аккордеонами, и единственный способ получить доступ к 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);
     }
}

Теперь вы можете получить все AccordionItems в данном аккордеоне:

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

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

Это может быть немного сложнее, чем нужно, в моем случае у меня был аккордеон ваккордеон, который в конце концов усложнил ситуацию.

...