DataGrid - свернуть все группы, кроме первой - PullRequest
5 голосов
/ 06 октября 2011

У меня есть DataGrid с сгруппированными ItemsSource.В каждой группе есть расширитель, поэтому я могу развернуть / свернуть все группы.Сейчас я пытаюсь свернуть все группы по умолчанию, но оставляю первую группу развернутой.Источник элементов является динамическим, поэтому я не могу собрать какой-либо конвертер для проверки имени группы.Я должен сделать это по групповому индексу.

Можно ли это сделать в XAML?Или в коде позади?

Пожалуйста, помогите.

Ответы [ 3 ]

7 голосов
/ 27 сентября 2012

Это может быть немного поздно, но для решения подобных проблем было бы полезно определить «класс помощника по визуальным деревьям» в этом случае.

    // the visual tree helper class
public static class VisualTreeHelper
{
    public static Collection<T> GetVisualChildren<T>(DependencyObject current) where T : DependencyObject
    {
        if (current == null)
            return null;

        var children = new Collection<T>();
        GetVisualChildren(current, children);
        return children;
    }
    private static void GetVisualChildren<T>(DependencyObject current, Collection<T> children) where T : DependencyObject
    {
        if (current != null)
        {
            if (current.GetType() == typeof(T))
                children.Add((T)current);

            for (int i = 0; i < System.Windows.Media.VisualTreeHelper.GetChildrenCount(current); i++)
            {
                GetVisualChildren(System.Windows.Media.VisualTreeHelper.GetChild(current, i), children);
            }
        }
    }
}

// then you can use the above class like this:
Collection<Expander> collection = VisualTreeHelper.GetVisualChildren<Expander>(dataGrid1);

    foreach (Expander expander in collection)
        expander.IsExpanded = false;

collection[0].IsExpanded = true;

кредит переходит на этот форум

1 голос
/ 17 января 2013

Мне удалось решить эту проблему в моей ViewModel.
Расширитель определен в шаблоне DataGrids GroupStyle.Привязка должна быть двухсторонней, но она запускается явно, поэтому нажатие в представлении не обновляет модель представления.Спасибо Рейчел .

<Expander IsExpanded="{Binding DataContext.AreAllGroupsExpanded, RelativeSource={RelativeSource AncestorType={x:Type local:MyControl}}, UpdateSourceTrigger=Explicit}">
    ...
</Expander>

Тогда я могу просто установить свойство AreAllGroupsExpanded в моей ViewModel.

0 голосов
/ 25 ноября 2011

Я не верю, что это может быть сделано в XAML, но это может быть сделано в коде позади. Вот одно решение, которое я протестировал в Silverlight. Вероятно, это должно работать так же хорошо в WPF.

// If you don't have a direct reference to the grid's ItemsSource, 
// then cast the grid's ItemSource to the type of the source.  
// In this example, I used a PagedCollectionView for the source.
PagedCollectionView pcv = (PagedCollectionView)myDataGrid.ItemsSource;

// Using the PagedCollectionView, I can get a reference to the first group. 
CollectionViewGroup firstGroup = (CollectionViewGroup)pcv.Groups[0];

// First collapse all groups (if they aren't already collapsed).
foreach (CollectionViewGroup group in pcv.Groups)
{
    myDataGrid.ScrollIntoView(group, null);  // This line is a workaround for a problem with collapsing groups when they aren't visible.
    myDataGrid.CollapseRowGroup(group, true);
}

// Now expand only the first group.  
// If using multiple levels of grouping, setting 2nd parameter to "true" will expand all subgroups under the first group.
myDataGrid.ExpandRowGroup(firstGroup, false);

// Scroll to the top, ready for the user to see!
myDataGrid.ScrollIntoView(firstGroup, null);
...