DataGrid: странное поведение авторазмера столбца при изменении данных - PullRequest
0 голосов
/ 05 марта 2019

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

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

  • LongString
  • ShortString1
  • ShortString2

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

Поэтому я определяю столбцы в XAML со следующими значениями ширины:

  • LongString: "*"
  • ShortString1: "Авто"
  • ShortString2: "Авто"

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

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. Запустите программу.

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

Снимок экрана (хорошо 1)

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

Что я ожидаю:

  • Сокращение столбца LongString
  • Растяжение столбца ShortString1
  • Столбец ShortString2 остается без изменений

Снимок экрана (хорошо 2)

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

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

снимок экрана (плохой 1)

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

Снимок экрана (плохой 2)

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

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

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

Снимок экрана (хорошо 3)

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

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

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

Целевая структура: 4.7.2.

...