Wpf DataGrid:数据更改时奇怪的列自动大小调整行为
具有Wpf DataGrid:数据更改时奇怪的列自动大小调整行为,wpf,datagrid,wpfdatagrid,Wpf,Datagrid,Wpfdatagrid,具有Width=“*”的列不会在具有Width=“Auto”的相邻列因其数据更改而扩展时自动收缩 我想在DataGrid中显示具有三个属性(从左到右)的对象列表: 长串 短线1 短线2 所有列都应可见:长字符串数据可以截断,而ShortString1和ShortString2应完全显示 因此,我使用以下宽度在XAML中定义列: 长串:“*” ShortString1:“自动” ShortString2:“自动” 最初一切正常,但当中间列中的值变长时,最右边的列从窗口滑出(我预计最左边的列
Width=“*”
的列不会在具有Width=“Auto”
的相邻列因其数据更改而扩展时自动收缩
我想在DataGrid中显示具有三个属性(从左到右)的对象列表:
- 长串
- 短线1
- 短线2
ShortString1
和ShortString2
应完全显示
因此,我使用以下宽度在XAML中定义列:
- 长串:“*”
- ShortString1:“自动”
- ShortString2:“自动”
最初一切正常,但当中间列中的值变长时,最右边的列从窗口滑出(我预计最左边的列会随着宽度为“*”而缩小)。 XAML:
修改
代码隐藏:
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;
}
}
使用System.Collections.ObjectModel;
使用系统组件模型;
使用System.Windows;
命名空间DataGridColumnWidthIssue
{
公共部分类主窗口:窗口
{
public observetecollection Infos{get;}=new observetecollection();
公共主窗口()
{
初始化组件();
添加(新信息(“Veeeeeery Looooooong Striiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii;
DataContext=this;
}
私有无效修改按钮\单击(对象发送方,路由目标)
{
Infos[0].ShortString1+=“AA”;
}
}
公共类信息:INotifyPropertyChanged
{
公共字符串长字符串{get;}
短串1;
公共字符串短字符串1
{
获取{return shortString1;}
设置
{
如果(值!=shortString1)
{
shortString1=值;
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(“ShortString1”);
}
}
}
公共字符串ShortString2{get;}
公共信息(字符串长字符串、字符串短字符串1、字符串短字符串2)
{
长串=长串;
ShortString1=ShortString1;
ShortString2=ShortString2;
}
公共事件属性更改事件处理程序属性更改;
}
}
第1步。运行程序。
结果与预期一样:所有列都可见
第2步。按两次窗口底部的“修改”按钮。(它将“AA”添加到中间列属性(ShortString1
)值。)
我所期望的是:
- 长串柱收缩
- ShortString1列拉伸
- ShortString2列保持不变
- LongString列保持不变
- ShortString1列拉伸
- ShortString2列向右移动,部分不可见
目标框架:4.7.2。你说最大化和恢复窗口可以解决你的问题。也许这只是在调整UpdateLayout?我试过了,但没有效果。很抱歉没有提及。Maciej S:谢谢你的编辑。你说最大化和恢复窗口可以解决你的问题。也许这只是在调整UpdateLayout?我试过了,但没有效果。谢谢你的编辑
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;
}
}