2010-03-02 12 views
5

Estoy usando RowDetailsTemplate para mostrar una cuadrícula de datos anidada para una fila. Ahora la cuadrícula de datos se expande en altura cuando selecciono una fila para mostrar esta cuadrícula de datos anidada. Pero no reduce su altura cuando la fila está deseleccionada.Redimensionar la altura de la cuadrícula de datos después de desmarcar una RowDetailsTemplate

  1. ¿Hay una manera de cambiar el tamaño de la cuadrícula de datos a su altura original después de que los datos de fila se han colapsado?

  2. ¿Es posible hacerlo declarativamente?

Respuesta

1

Encontré una solución alternativa a este problema; en el evento de selección cambiado para la cuadrícula se activa una actualización de los elementos de las cuadrículas, esto hace que la cuadrícula se rediseñe a sí misma.

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

Esto funcionó para mí. Espero eso ayude.

+0

Funcionó para mí, thx – Artiom

-1

Conjunto del DataGrid.VerticalAlignment = System.Windows.VerticalAlignment.Top

+2

Esto no hace nada para resolver el problema. – Harv

2

Lugar detalle en StackPanel y la red con este este comportamiento:

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; 
      } 
     } 
    } 
} 

y XAML se ve así:

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

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

Esto funcionó para mí.

+0

¿Qué es la clase de Comportamiento? – Artiom

0

Nota: Si necesita que su anidado DataGrid tenga un desplazamiento independiente, esto no le servirá. Ese detalle no fue mencionado en la Pregunta del OP.

Me doy cuenta de que este es un hilo viejo, pero me encontré con él mientras buscaba una manera de resolver mi problema y pensé que a otros les gustaría ver lo que encontré. No probé el enfoque de comportamiento sugerido por HolaJan porque estaba buscando en mi opinión una solución más limpia para mi problema. Dicho esto, encontré una publicación en un foro de MSDN para usar declarativamente ScrollViewer.CanContentScroll="False" en el DataGrid.

El puesto donde encontré mi solución está en: http://social.msdn.microsoft.com/Forums/is/wpf/thread/a0e7aea8-e9ad-441f-a775-1178aab75fb0

La respuesta está en la respuesta marcada y es:.
"Me parecía haber resuelto el problema mediante el establecimiento de un entorno totalmente sin relación

En las cuadrículas de mi hijo tenía ScrollViewer.CanContentScroll establecido en True. Una vez que lo configuré en False en todos los Child Grid s, parecía funcionar mágicamente. Ahora cuando colapso los detalles de mi fila, cambia el tamaño de la fila que los contiene apropiadamente ".

Cuestiones relacionadas