2010-10-25 13 views
12

Estoy usando WPF Toolkit Datagrid en una de las aplicaciones en las que estoy trabajando. Lo que quiero es almacenar el ancho de la columna y el índice de visualización como una preferencia del usuario. Lo logré para displayindex de columna, pero para cambiar el tamaño no pude encontrar ningún evento en la cuadrícula de datos que se activará después de cambiar el tamaño de la columna. He intentado el evento "SizeChanged", que supongo que solo se activa cuando se calcula inicialmente el tamaño y también para toda la cuadrícula de datos y no para las columnas individuales.
¿Alguna solución alternativa o si alguien sabe sobre el evento?WPF Toolkit DataGrid tamaño de columna evento

Respuesta

-1

Puede intentar extender DataGrid y luego implementar un evento NotifyPropertyChange. Algo como esto:

class MyDataGrid : DataGrid, INotifyPropertyChanged 
{ 
    private DataGridLength _columnWidth; 
    public DataGridLength ColumnWidth 
    { 
     get { return _columnWidth; } 
     set 
     { 
      _columnWidth = value; 
      NotifyPropertyChanged("ColumnWidth"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

A partir de ahí, se puede añadir una delagate al controlador para hacer lo que quiere que haga. Algo así como:

MyDataGrid dataGrid; 
//init grid, do stuff 

dataGrid.PropertyChanged += new PropertyChangedEventHandler(ColumnWidthChanged); 
//ColumnWidthChanged will be a method you define 

Ahora que tiene la delagate, se puede definir lo que queremos que suceda cuando el ancho de columna se cambia:

private void ColumnWidthChanged(object sender, PropertyChangedEventArgs args) 
{ 
    if(args.PropertyName.Equals("ColumnWidth")) 
    { 
     //Do stuff now that the width is changed 
    } 
} 

Se dará cuenta de que estoy comprobando para los cuales la propiedad fue cambiada La forma en que lo configuro es tal que puede extender otras propiedades y hacer que los manejadores también cambien. Si desea más de un controlador, probablemente sea mejor hacer un método DataGridPropertyChanged que active qué propiedad se modificó. Luego llamaría al método apropiado (como ColumnWidthChanged) para cada propiedad que cambia. De esta forma, no tendrá que verificar que cada controlador solo modifique una propiedad.

No especificó un idioma, por lo que etiqueté esto como C#. Sin embargo, debería ser lo suficientemente simple para transponer a VB si eso es lo que estás usando.

Espero que esto ayude!

+0

Esto realmente no ayuda porque solo tiene un ancho de columna y su evento solo se incrementará si la columna cambia de tamaño en el código, algo que podría atrapar de todos modos. – MikeKulls

0

Supongo que desea guardar los anchos de columna para que la próxima vez que se inicie la aplicación se usen los mismos anchos de columna para generar la cuadrícula de datos.

Si ese es el caso, una alternativa es guardar los anchos de columna (y los índices) cuando se cierra la aplicación, lo que también sería más eficiente que guardar los anchos cada vez que se cambia el tamaño de una columna.

Dependiendo de cómo se estructure su aplicación, algo como esto debería funcionar ...

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    foreach (DataGridColumn column in dataGrid1.Columns) 
    { 
    // save the column.Width property to a user setting/file/registry/etc... 
    // optionally save the displayindex as well... 
    } 
} 
+0

Hola, ¿puedes darme alguna pista sobre cómo copiar el valor de C# a xaml? He intentado esto: Diccionario list = new Dictionary (); foreach (columna DataGridColumn en DataGridView.Columns) { DataGridLength x = column.Width; list.Add (column.Header.ToString(), x); } – user1850936

9

tomado de ...:

http://forums.silverlight.net/post/602788.aspx

después de la carga:

PropertyDescriptor pd = DependencyPropertyDescriptor 
          .FromProperty(DataGridColumn.ActualWidthProperty, 
              typeof(DataGridColumn)); 

     foreach (DataGridColumn column in Columns) { 
       //Add a listener for this column's width 
       pd.AddValueChanged(column, 
            new EventHandler(ColumnWidthPropertyChanged)); 
     } 

2 métodos:

private bool _columnWidthChanging; 
    private void ColumnWidthPropertyChanged(object sender, EventArgs e) 
    { 
     // listen for when the mouse is released 
     _columnWidthChanging = true; 
     if (sender != null) 
      Mouse.AddPreviewMouseUpHandler(this, BaseDataGrid_MouseLeftButtonUp); 
    } 

    void BaseDataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     if (_columnWidthChanging) { 
      _columnWidthChanging = false; 
      // save settings, etc 

     } 
    } 

ColumnWidthPropertyChanged se dispara constantemente mientras el usuario arrastra el ancho. Agregar el controlador PreviewMouseUp le permite procesar cuando el usuario finaliza.

+0

No funciona si utilizamos doble clic. Haga doble clic para establecer el ancho de la columna "auto". – Rover

+1

@Rover ... pero hacer doble clic tiene un evento fácil de atrapar. No veo cuál es el problema. –

+0

Un problema es que agrega muchos manejadores de eventos – stefan

1

¿Disposición actualizadas?

Estoy trabajando en Silverlight, y la cuadrícula se recupera/actualiza cada segundo.

Estoy utilizando el método LayoutUpdated, que se activa para cada evento de actualización de diseño.

Puede mantener un diccionario de los anchos de columna y verificar los deltas. Entonces sabría qué columna (s) había cambiado.

Cuestiones relacionadas