Изменить размер сетки данных после отмены выбора шаблона RowDetailsTemplate - PullRequest
5 голосов
/ 02 марта 2010

Я использую RowDetailsTemplate для отображения вложенной сетки данных для строки.Теперь сетка данных увеличивается по высоте, когда я выбираю строку, чтобы показать эту вложенную сетку данных.Но это не уменьшает его высоту, когда строка отменяется.

  1. Есть ли способ изменить размер сетки данных до ее первоначальной высоты после сворачивания деталей строки?

  2. Можно ли сделать это декларативно?

Ответы [ 4 ]

2 голосов
/ 25 декабря 2011

Поместите детали в StackPanel и сетку с этим поведением:

public class DataGridDetailResizeBehavior : Behavior<FrameworkElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.SizeChanged += new SizeChangedEventHandler(Element_SizeChanged);
    }

    protected override void OnDetaching()
    {
        this.AssociatedObject.SizeChanged -= new SizeChangedEventHandler(Element_SizeChanged);
        base.OnDetaching();
    }

    private void Element_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        //Find DataGridDetailsPresenter
        DataGridDetailsPresenter rowDetailPresenter = null;
        var element = this.AssociatedObject;
        while (element != null)
        {
            rowDetailPresenter = element as DataGridDetailsPresenter;
            if (rowDetailPresenter != null)
            {
                break;
            }

            element = (FrameworkElement)VisualTreeHelper.GetParent(element);
        } 

        if (rowDetailPresenter != null)
        {
            var row = UIHelper.GetParentOf<DataGridRow>(this.AssociatedObject);
            if (row != null && row.DetailsVisibility == Visibility.Visible)
            {
                //Set height
                rowDetailPresenter.ContentHeight = this.AssociatedObject.ActualHeight;
            }
        }
    }
}

и XAML выглядит так:

<sdk:DataGrid.RowDetailsTemplate>
    <DataTemplate>
        <StackPanel>
            <Grid>
                <sdk:DataGrid...

                <i:Interaction.Behaviors>
                    <myinteractivity:DataGridDetailResizeBehavior />
                </i:Interaction.Behaviors>
            </Grid>
        </StackPanel>
    </DataTemplate>
</sdk:DataGrid.RowDetailsTemplate>

Это сработало для меня.

1 голос
/ 09 декабря 2010

Нашли решение этой проблемы; при изменении события выбора для сетки запускается обновление элементов сетки, при этом сетка перерисовывается сама.

    private void dgVehicles_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        DataGrid dg = sender as DataGrid;
        if (dg != null)
        {
            dg.Items.Refresh();
        }
        e.Handled = true;
    }

Это сработало для меня. Надеюсь, это поможет.

0 голосов
/ 14 июня 2012

Примечание. Если вам нужна вложенная DataGrid для независимой прокрутки, это не сработает. Эта деталь не была упомянута в вопросе ОП.

Я понимаю, что это старая ветка, но я наткнулся на нее, когда искал способ решить мою проблему, и подумал, что другие могут захотеть увидеть то, что я нашел. Я не пробовал поведенческий подход, предложенный HolaJan, потому что я искал более чистое решение моей проблемы. Тем не менее, я нашел сообщение на форуме MSDN для декларативного использования ScrollViewer.CanContentScroll="False" на DataGrid.

Пост, где я нашел свое решение, находится по адресу: http://social.msdn.microsoft.com/Forums/is/wpf/thread/a0e7aea8-e9ad-441f-a775-1178aab75fb0

Ответ лежит в помеченном ответе:
«Кажется, я решил проблему, установив совершенно не связанные настройки.

В моих дочерних сетках ScrollViewer.CanContentScroll было установлено True. Однажды я установил значение «Ложь» во всех «Детях», и это, казалось, волшебным образом сработало. Теперь, когда я сверну детали строки, он соответствующим образом изменит размер содержащей строки. "

0 голосов
/ 23 декабря 2010

Установите DataGrid.VerticalAlignment = System.Windows.VerticalAlignment.Top

...