2010-03-02 3 views
5

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

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

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

ответ

1

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

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

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

+0

Работал для меня, thx – Artiom

-1

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

+2

Это не поможет решить эту проблему. – Harv

2

Места детали в 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> 

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

+0

Что такое класс поведения? – Artiom

0

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

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

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

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

В моих дочерних сетках у меня было ScrollViewer.CanContentScroll, установленное на True. После того, как я установил его для False во всем дочернем Grid, он казался магическим образом. Теперь, когда я разрушаю детали строки, он соответствующим образом изменяет размер строки. "

Смежные вопросы