相邻Width="*"
的列由于数据更改而扩展时,Width="Auto"
的列不会自动收缩。
我想在DataGrid中显示具有三个属性(从左到右)的对象列表:
所有列均应可见:LongString数据可以截断,而ShortString1
和ShortString2
应该完整显示。
因此,我在XAML中定义了以下宽度的列:
最初一切正常,但是当中间列的值变长时,最右边的列会滑出窗口(我希望最左边的列会随着其宽度为“ *”而缩小)。
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.运行程序。
结果符合预期:所有列均可见。
步骤2。按两次窗口底部的“修改”按钮。 (它将“ AA”添加到中间列属性(ShortString1
)值。)
我期望的是
实际发生的事情:
第3步。再按3次“修改”。 ShortString2
几乎完全不在窗口内。
一个有趣的细节是最大化和还原窗口后,列宽变为预期的值。
更新:数据更改后,UpdateLayout()无效(对窗口和网格均进行了尝试
第4步。最大化并还原窗口
此行为正确吗?
是否有解决方法来获得预期的行为?
感谢您的帮助。
目标框架:4.7.2。