DataGrid:奇怪的列在数据更改时的自动调整大小行为

时间:2019-03-05 09:31:34

标签: wpf datagrid wpfdatagrid

相邻Width="*"的列由于数据更改而扩展时,Width="Auto"的列不会自动收缩。

我想在DataGrid中显示具有三个属性(从左到右)的对象列表:

  • LongString
  • ShortString1
  • ShortString2

所有列均应可见:LongString数据可以截断,而ShortString1ShortString2应该完整显示。

因此,我在XAML中定义了以下宽度的列:

  • LongString:“ *”
  • ShortString1:“自动”
  • ShortString2:“自动”

最初一切正常,但是当中间列的值变长时,最右边的列会滑出窗口(我希望最左边的列会随着其宽度为“ *”而缩小)。

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.运行程序。

结果符合预期:所有列均可见。

Screenshot (good 1)

步骤2。按两次窗口底部的“修改”按钮。 (它将“ AA”添加到中间列属性(ShortString1)值。)

我期望的是

  • LongString列缩小
  • ShortString1列拉伸
  • ShortString2列保持不变

Screenshot (good 2)

实际发生的事情:

  • LongString列保持不变
  • ShortString1列拉伸
  • ShortString2列向右移动并部分脱离可见性

Screenshot (bad 1)

第3步。再按3次“修改”。 ShortString2几乎完全不在窗口内。

Screenshot (bad 2)

一个有趣的细节是最大化和还原窗口后,列宽变为预期的值。

更新:数据更改后,UpdateLayout()无效(对窗口和网格均进行了尝试

第4步。最大化并还原窗口

Screenshot (good 3)

此行为正确吗?

是否有解决方法来获得预期的行为?

感谢您的帮助。

目标框架:4.7.2。

0 个答案:

没有答案