Utilizzo il toolkit di WPF Datagrid in una delle applicazioni su cui sto lavorando. Quello che voglio è memorizzare la larghezza della colonna e displayindex come preferenza dell'utente. L'ho acquisito per column displayindex ma per ridimensionare non sono riuscito a trovare alcun evento sul datagrid che si innescherà dopo la modifica della dimensione della colonna. Ho provato l'evento "SizeChanged" che immagino sia attivato solo quando inizialmente calcola la dimensione e anche quello è per l'intero datagrid e non per le singole colonne.
Qualche soluzione alternativa o se qualcuno conosce l'evento?WPF Toolkit DataGrid evento di ridimensionamento della colonna
risposta
Si potrebbe provare ad estendere DataGrid
e quindi a implementare un evento NotifyPropertyChange
. Qualcosa di simile a questo:
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));
}
}
}
Da lì, è possibile aggiungere un delagate al gestore a fare quello che vuoi che faccia. Qualcosa di simile:
MyDataGrid dataGrid;
//init grid, do stuff
dataGrid.PropertyChanged += new PropertyChangedEventHandler(ColumnWidthChanged);
//ColumnWidthChanged will be a method you define
Ora che avete la delagate, è possibile definire ciò che si vuole che accada quando la larghezza della colonna è cambiato:
private void ColumnWidthChanged(object sender, PropertyChangedEventArgs args)
{
if(args.PropertyName.Equals("ColumnWidth"))
{
//Do stuff now that the width is changed
}
}
Noterete che sto controllando per i quali proprietà è stata cambiata. Il modo in cui l'ho impostato è tale che puoi estendere altre proprietà e rendere i gestori anche i loro cambiamenti. Se si desidera più di un gestore, sarebbe probabilmente meglio creare un metodo DataGridPropertyChanged
che attivi quale proprietà è stata modificata. Chiamerebbe quindi il metodo appropriato (come ColumnWidthChanged
) per ogni proprietà che viene modificata. In questo modo, non dovrai controllare che ogni gestore modifichi solo una proprietà.
Non hai specificato una lingua, quindi l'ho reindirizzata a C#. Tuttavia, dovrebbe essere abbastanza semplice da trasporre in VB se è quello che stai usando.
Spero che questo aiuti!
Presumo che si desideri salvare le larghezze delle colonne in modo che al successivo avvio dell'applicazione vengano utilizzate le stesse larghezze di colonna per generare la griglia di dati.
In questo caso, un'alternativa è salvare le larghezze delle colonne (e gli indici) quando l'applicazione viene chiusa, il che sarebbe anche più efficiente del salvataggio delle larghezze ogni volta che una colonna viene ridimensionata.
A seconda di come l'applicazione è strutturata, qualcosa di simile dovrebbe funzionare ...
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...
}
}
Ciao, puoi darmi qualche indizio su come copiare il valore da C# a xaml? Ho provato questo: Dizionario
tratto da ...:
http://forums.silverlight.net/post/602788.aspx
dopo il carico:
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 metodi:
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
}
}
The ColumnWidthPropertyChanged si attiva costantemente mentre l'utente trascina la larghezza intorno. L'aggiunta del gestore di PreviewMouseUp consente di elaborare quando l'utente ha terminato.
LayoutAggiornato?
Sto lavorando in Silverlight e la griglia viene rimbalzata/aggiornata ogni secondo.
Sto utilizzando il metodo LayoutUpdated, che viene attivato per ogni evento di aggiornamento del layout.
È possibile mantenere un dizionario delle larghezze delle colonne e controllare i delta. Allora sapresti quale/i colonna/e è cambiata.
foreach (DataGridColumn column in dataGrid1.Columns)
{
// check for changes...
// save the column.Width property to a dictionary...
}
Questo non aiuta perché hai una sola larghezza della colonna e il vostro evento sarà ottenere sollevato soltanto se la colonna è stata ridimensionata nel codice, qualcosa che si poteva trappola in ogni caso. – MikeKulls