Ширина столбца DataGrid не обновляется автоматически

  

Когда значение Change изменяется, его столбец не обновляется, чтобы соответствовать новому значению. Таким образом, столбец остается слишком маленьким, а значение обрезается.
Есть идеи?

DataGrid будет увеличивать размеры столбцов до тех пор, пока данные становятся длиннее, но не уменьшает размер столбцов при уменьшении длины данных. В вашем примере вы правильно выравниваете столбец «Изменить» и используете остальную часть пространства для столбца «Имя».

Теперь, когда свойство «Изменить» становится настолько большим, что оно должно увеличить ширину столбца, столбец «Имя» отказывается сжиматься для размещения, поэтому вам нужно принудительно обновить его.

Следующие шаги должны сделать это для вас (я включил пример приложения для демонстрации):

1) В ваших привязках DataGridTextColumn (все, кроме столбца размера *) установите NotifyTargetUpdated = True.
2) В DataGrid добавьте обработчик события TargetUpdated.
3) В обработчике событий TargetUpdated:
– a) Установите ширину столбца размера DataGrid * равным 0.
– b) Вызвать метод UpdateLayout () в DataGrid.
– c) Установите ширину столбца размера размера DataGrid на новую DataGridLength (1, DataGridLengthUnitType.Star)

Пример XAML:

                 

Пример кода:

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

У меня была схожая проблема с моим списком, решение, которое я нашел в инструкции по настройке и настройке-gridviewcolumn-data-in-wpf здесь, в stackoverflow.

В моем случае он добавлял этот fragment кода в обработчик событий, посвященный коллекции, из наблюдаемой коллекции, с которой связано представление списка:

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

Это работает для меня, хотя иногда пользователь может заметить «мигать» над столбцами.

WPF просто изменит размер ширины столбца datagrid, установленный на Auto, если это необходимо, т.е.: содержимое не может быть полностью отображено. Поэтому, когда ширина содержимого уменьшается, столбец не изменяется, поскольку контент все еще можно увидеть полностью.

единственный способ, с помощью которого я могу заставить wpf пересчитать ширину столбцов, должен был заставить их всех к 0, а затем вернуться к авто в коде позади, с одним или двумя updateLayout (), которые были введены, но это не очень приятное программирование : – /

в основном, в вашем коде:

 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; 

и вам, вероятно, понадобится dg.UpdateLayout() или два где-нибудь там (после того, как обновление и установка вернутся к авто, вероятно)

Один из способов решения этой проблемы – определить свойство width столбца в настройке стиля и привязать этот параметр к свойству объекта, к которому вы привязываетесь.

  

В вашем ресурсе:

  

ColumnWidth должен быть свойством вашего объекта. Теперь, если вы обновите это свойство у установщика вашего свойства «Изменить» (используя некоторый самоопределяемый алгоритм, принимая во внимание такие вещи, как шрифт), и вызывая:

 RaisePropertyChanged("ColumnWidth"); 

Он должен обновить ширину столбца.

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

Вы пробовали это?

  
  • ViewModels в ViewModelLocator MVVM Light
  • Создание экземпляра вложенного classа в XAML
  • KeyBinding в UserControl не работает, когда TextBox имеет фокус
  • Как связать массив байтов с изображением в WPF с преобразователем значений?
  • Изменение цвета ячейки DataGrid на основе значений
  • Как заставить детей StackPanel заполнить максимальное пространство вниз?
  • Связывание RelativeSource с помощью ToolTip или ContextMenu
  • URI «clr-namespace» относится к пространству имен, которое не входит в сборку
  • Image UriSource и привязка данных
  • Ошибка WPF 40 Ошибка BindingExpression path: свойство не найдено в 'объекте'
  • Какие подходы доступны для фиктивных данных времени разработки в WPF?
  • Давайте будем гением компьютера.