La largeur de la colonne DataGrid ne se met pas à jour automatiquement

  

Lorsque la valeur de Change mise à jour, sa colonne ne se met pas à jour pour s’adapter à la nouvelle valeur. La colonne rest donc trop petite et la valeur est tronquée.
Des idées?

Le DataGrid augmentera la taille des colonnes pour s’adapter au fur et à mesure que les données s’allongeront, mais ne diminuera pas automatiquement la taille des colonnes lorsque la longueur des données diminuera. Dans votre exemple, vous alignez correctement la colonne “Modifier” et utilisez le rest de l’espace pour la colonne “Nom”.

Désormais, lorsqu’une propriété ‘Change’ devient suffisamment grande pour augmenter la largeur de la colonne, la colonne ‘Nom’ refuse de se rétrécir pour s’adapter. Vous devez donc forcer l’actualisation vous-même.

Les étapes suivantes devraient faire cela pour vous (j’ai inclus un exemple d’application à la démo):

1) Dans vos liaisons DataGridTextColumn (toutes sauf la colonne * de votre taille), définissez NotifyTargetUpdated = True.
2) Sur votre grid de données, ajoutez un gestionnaire à l’événement TargetUpdated.
3) Dans votre gestionnaire d’événements TargetUpdated:
– a) Définissez la largeur de la colonne dimensionnée du DataGrid * sur 0.
– b) Appelez la méthode UpdateLayout () sur le DataGrid.
– c) Définissez la largeur de la colonne de la taille de DataGrid * sur new DataGridLength (1, DataGridLengthUnitType.Star)

Exemple XAML:

                 

Exemple de code derrière:

 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 ssortingng firstName; public ssortingng First { get { return this.firstName; } set { if (this.firstName != value) { this.firstName = value; NotifyPropertyChanged("First"); } } } private ssortingng lastName; public ssortingng 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(Ssortingng info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } #endregion INotifyPropertyChanged Contract } } 

J’ai eu un problème similaire avec mon listview, la solution que j’ai trouvée sur comment-redimensionner-automatique-et-droite-aligner-gridviewcolumn-data-in-wpf ici sur stackoverflow.

Dans mon cas, il s’agissait d’append ce morceau de code au gestionnaire d’événements collectionchanged de la collection observable auquel la vue liste était liée:

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

Cela fonctionne pour moi, même si parfois l’utilisateur peut remarquer des “clignotements” sur les colonnes.

WPF ne fera que redimensionner la largeur de colonne d’une grid de données définie sur Auto si nécessaire, c’est-à-dire: le contenu ne peut pas être affiché entièrement. Ainsi, lorsque la largeur du contenu diminue, la colonne ne se redimensionne pas, car le contenu est toujours visible intégralement.

le seul moyen que je vois pour forcer wpf à recalculer la largeur des colonnes serait de les forcer tous à 0, puis à nouveau en auto dans le code derrière, avec un ou deux updateLayout () insérés, mais ce n’est pas une très bonne programmation : – /

fondamentalement, dans votre code derrière:

 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; 

et vous avez probablement besoin d’un dg.UpdateLayout() ou de deux autres quelque part (après la mise à jour et le réglage automatique probablement)

Vous pouvez résoudre ce problème en définissant la propriété width de la colonne dans un paramètre de style et en liant ce paramètre à une propriété de l’object auquel vous vous liez.

  

Dans votre ResourceDictionary:

  

ColumnWidth doit être une propriété de votre object. Maintenant, si vous mettez à jour cette propriété à partir du paramètre de votre propriété ‘Change’ (en utilisant un algorithme auto-défini, en prenant en compte des éléments comme la police de caractères), et en appelant:

 RaisePropertyChanged("ColumnWidth"); 

Il devrait mettre à jour la largeur de votre colonne.

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

Avez-vous essayé cela?