void listview_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) {
// this is a listview control
GridView view = this.View as GridView;
foreach(GridViewColumn c in view.Columns) {
if(double.IsNaN(c.Width)) {
c.Width = c.ActualWidth;
}
c.Width = double.NaN;
}
}
foreach (DataGridColumn c in dg.Columns)
c.Width = 0;
// Update your DG's source here
foreach (DataGridColumn c in dg.Columns)
c.Width = DataGridLength.Auto;
5条答案
按热度按时间u4vypkhs1#
当数据变长时,DataGrid将增加列的大小以适应数据,但当数据的长度减小时,它不会自动减小列的大小。在示例中,您将"更改"列右对齐,并将其余空间用于"名称"列。
现在,当"Change"属性增长到足以增加列的宽度时,"Name"列拒绝收缩以适应,因此您必须自己强制刷新。
以下步骤可以帮助您完成此操作(我已提供了一个示例应用程序进行演示):
1)在DataGridTextColumn系结中(除了 * 大小的数据行以外的所有数据行),设定NotifyTargetUpdated = True。
2)在DataGrid上,将行程常式加入至TargetUpdated事件。
3)在TargetUpdated事件行程常式中:
示例XAML:
示例代码隐藏:
frebpwbc2#
我的listview也有类似的问题,我在stackoverflow上的how-to-autosize-and-right-align-gridviewcolumn-data-in-wpf上找到了解决方案。
在我的例子中,它将这段代码添加到列表视图绑定到的可观察集合的collectionchanged事件处理程序中:
它对我很有效,尽管有时用户可以注意到列上的" Flink "。
7bsow1i63#
如果需要,WPF将调整数据网格的列宽设置为Auto,即:内容无法完整显示。因此,当内容的宽度缩小时,列不会调整大小,因为内容仍然可以完整显示。
我认为强制wpf重新计算列宽的唯一方法是强制它们全部为0,然后在后面的代码中返回auto,并抛出一个或两个updateLayout(),但这不是很好的编程:-/
基本上,在您代码后面:
你可能需要一个
dg.UpdateLayout()
或两个地方在那里(更新和设置回到自动可能后)hmtdttj44#
解决此问题的一种方法是在样式设置中定义列的width属性,并将该设置绑定到要绑定到的对象的属性。
在资源字典中:
ColumnWidth应该是对象的一个属性。现在,如果您从'Change'属性的setter中更新此属性(通过使用一些自定义的算法,将字体等内容考虑在内),并调用:
它应该会更新您的栏宽。
vtwuwzda5#
你试过这个吗?