DataGrid: странное поведение автоматического изменения размера столбца при изменении данных

#wpf #datagrid #wpfdatagrid

#wpf #datagrid #wpfdatagrid

Вопрос:

Столбец с Width="*" не сжимается автоматически, когда соседний столбец с Width="Auto" расширяется из-за изменения его данных.

Я хочу показать в DataGrid список объектов с тремя свойствами (слева направо):

  • Длинная строка
  • Короткая строка 1
  • Короткая строка 2

Все столбцы должны быть видны: данные длинной строки могут быть усечены, тогда как ShortString1 и ShortString2 должны отображаться полностью.

Итак, я определяю столбцы в XAML со следующей шириной:

  • Длинная строка: «*»
  • Короткая строка 1: «Auto»
  • Короткая строка 2: «Auto»

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

XAML:

 <Window x:Class="DataGridColumnWidthIssue.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="250" Width="400">
    <DockPanel>
        <Button Name="modifyButton" DockPanel.Dock="Bottom" HorizontalAlignment="Center"
                Padding="30,5,30,5" Click="modifyButton_Click">
            Modify
        </Button>
        <DataGrid Name="infoGrid" ItemsSource="{Binding Infos}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Long String" Binding="{Binding LongString}" Width="*"/>
                <DataGridTextColumn Header="Short String 1" Binding="{Binding ShortString1}" Width="Auto"/>
                <DataGridTextColumn Header="Short String 2" Binding="{Binding ShortString2}" Width="Auto"/>
            </DataGrid.Columns>
        </DataGrid>
    </DockPanel>
</Window>
  

Ошибка в коде:

 using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace DataGridColumnWidthIssue
{
    public partial class MainWindow : Window
    {
        public ObservableCollection<Info> Infos { get; } = new ObservableCollection<Info>();

        public MainWindow()
        {
            InitializeComponent();
            Infos.Add(new Info("Veeeeeeeeery looooooooooooong striiiiiiiiiiiiiing", "Short string 1", "Short string 2"));
            DataContext = this;
        }

        private void modifyButton_Click(object sender, RoutedEventArgs e)
        {
            Infos[0].ShortString1  = "AA";
        }
    }

    public class Info : INotifyPropertyChanged
    {
        public string LongString { get; }

        string shortString1;
        public string ShortString1
        {
            get { return shortString1; }
            set
            {
                if (value != shortString1)
                {
                    shortString1 = value;
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ShortString1"));
                }
            }
        }

        public string ShortString2 { get; }

        public Info(string longString, string shortString1, string shortString2)
        {
            LongString = longString;
            ShortString1 = shortString1;
            ShortString2 = shortString2;
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}
  

Шаг 1. Запустите программу.

Результат соответствует ожиданиям: видны все столбцы.

Скриншот (хороший 1)

Шаг 2. Дважды нажмите кнопку «Изменить» в нижней части окна. (Это добавляет «AA» к значению свойства среднего столбца ( ShortString1 ).)

Чего я ожидаю:

  • Столбец с длинной строкой сжимается
  • Столбец ShortString1 растягивается
  • Столбец ShortString2 остается неизменным

Скриншот (хороший 2)

Что происходит на самом деле:

  • Столбец с длинной строкой остается неизменным
  • Столбец ShortString1 растягивается
  • Столбец ShortString2 перемещается вправо и частично исчезает из видимости

Скриншот (ошибка 1)

Шаг 3. Нажмите «Изменить» еще 3 раза. ShortString2 Почти полностью отсутствует окно.

Скриншот (ошибка 2)

Интересная деталь заключается в том, что после максимизации и восстановления окна ширина столбца становится такой, как ожидалось.

ОБНОВЛЕНИЕ: UpdateLayout() после изменения данных не имеет никакого эффекта (пробовалось как для окна, так и для сетки)

Шаг 4. Разверните и восстановите окно

Скриншот (хороший 3)

Правильно ли это поведение?

Существуют ли обходные пути для получения ожидаемого поведения?

Спасибо за любую помощь.

Целевая платформа: 4.7.2.

Комментарии:

1. вы говорите, что разворачивание и восстановление окна устраняет вашу проблему. Может быть, все, что это делает, это вызывает UpdateLayout? попробуйте сделать это вручную

2. Я пробовал, и это не дало никакого эффекта. Извините, что не упомянул об этом.

3. Мацей С: Спасибо за ваше редактирование