La larghezza della colonna DataGrid non si aggiorna automaticamente

  

Quando il valore di Change aggiorna, la sua colonna non si aggiorna per adattarsi al nuovo valore. Quindi la colonna rimane troppo piccola e il valore è troncato.
Qualche idea?

DataGrid aumenterà le dimensioni delle colonne per adattarle all’aumentare dei dati, ma non diminuisce automaticamente le dimensioni delle colonne quando la lunghezza dei dati diminuisce. Nel tuo esempio, hai ragione ad allineare la colonna “Cambia” e utilizzare il resto dello spazio per la colonna “Nome”.

Ora, quando una proprietà ‘Cambia’ cresce abbastanza grande da aumentare la larghezza della colonna, la colonna ‘Nome’ si rifiuta di ridursi per adattarsi, quindi devi forzare un aggiornamento da solo.

I seguenti passaggi dovrebbero fare questo per te (ho incluso un’app di esempio alla demo):

1) Nei tuoi collegamenti DataGridTextColumn (tutti tranne la colonna * di dimensioni) impostare NotifyTargetUpdated = True.
2) Sul tuo DataGrid, aggiungi un gestore all’evento TargetUpdated.
3) Nel gestore di eventi TargetUpdated:
– a) Impostare la larghezza della colonna di dimensioni * del DataGrid su 0.
– b) Chiamare il metodo UpdateLayout () sul DataGrid.
– c) Impostare la larghezza della colonna di dimensioni di DataGrid su new DataGridLength (1, DataGridLengthUnitType.Star)

Esempio XAML:

                 

Esempio di codice dietro:

 using System; using System.Collections.ObjectModel; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.ComponentModel; namespace DataGridTest { ///  /// Interaction logic for MainWindow.xaml ///  public partial class MainWindow : Window { private ObservableCollection myObjectList = new ObservableCollection(); public MainWindow() { InitializeComponent(); (this.FindResource("MyObjectCollection") as CollectionViewSource).Source = this.myObjectList; this.myObjectList.Add(new MyObject() { First = "Bob", Last = "Jones" }); this.myObjectList.Add(new MyObject() { First = "Jane", Last = "Doe" }); } private void Button_Click(object sender, RoutedEventArgs e) { this.myObjectList[0].Last = "BillyOBrian"; } private void dg_TargetUpdated(object sender, DataTransferEventArgs e) { dg.Columns[0].Width = 0; dg.UpdateLayout(); dg.Columns[0].Width = new DataGridLength(1, DataGridLengthUnitType.Star); } } public class MyObject : INotifyPropertyChanged { private string firstName; public string First { get { return this.firstName; } set { if (this.firstName != value) { this.firstName = value; NotifyPropertyChanged("First"); } } } private string lastName; public string Last { get { return this.lastName; } set { if (this.lastName != value) { this.lastName = value; NotifyPropertyChanged("Last"); } } } public MyObject() { } #region -- INotifyPropertyChanged Contract -- public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } #endregion INotifyPropertyChanged Contract } } 

Ho avuto problemi simili con il mio listview, la soluzione che ho trovato su how-to-autosize-and-right-align-gridviewcolumn-data-in-wpf qui su StackOverflow.

Nel mio caso aggiungeva questa parte di codice al gestore di eventi collectionchanged della collezione osservabile a cui la vista elenco era vincasting:

 void listview_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { // this is a listview control GridView view = this.View as GridView; foreach(GridViewColumn c in view.Columns) { if(double.IsNaN(c.Width)) { c.Width = c.ActualWidth; } c.Width = double.NaN; } } 

Funziona per me, anche se a volte l’utente può notare “lampeggiare” sulle colonne.

WPF ridimensionerà semplicemente la larghezza della colonna di un datagrid impostata su Auto, se necessario, ovvero: il contenuto non può essere visualizzato interamente. Pertanto, quando la larghezza del contenuto si riduce, la colonna non viene ridimensionata poiché il contenuto può ancora essere visto interamente.

l’unico modo che posso vedere per forzare wpf a ricalcolare le larghezze delle colonne sarebbe forzarli tutti a 0 e poi tornare ad auto nel codice sottostante, con uno o due updateLayout (), ma questa non è una programmazione molto bella : – /

fondamentalmente, nel tuo codice dietro:

 foreach (DataGridColumn c in dg.Columns) c.Width = 0; // Update your DG's source here foreach (DataGridColumn c in dg.Columns) c.Width = DataGridLength.Auto; 

e probabilmente hai bisogno di un dg.UpdateLayout() o due da qualche parte lì dentro (dopo l’aggiornamento e l’impostazione torna automaticamente ad auto)

Un modo per risolvere questo problema è definire la proprietà width della colonna in un’impostazione di stile e associare tale impostazione a una proprietà dell’object a cui si sta vincolando.

  

Nel tuo ResourceDictionary:

  

ColumnWidth dovrebbe essere una proprietà del tuo object. Ora se aggiorni questa proprietà dal setter della tua proprietà ‘Change’ (usando un algoritmo auto-definito, prendendo in considerazione cose come il font) e chiamando:

 RaisePropertyChanged("ColumnWidth"); 

Dovrebbe aggiornare la larghezza della colonna.

  public int Change { get { return m_change; } set { if (m_change != value) { m_change = value; ColumnWidth = WidthAlgo(numberOfCharacters); RaisePropertyChanged("Change"); RaisePropertyChanged("ColumnWidth"); } } } 

Hai provato questo?