在WPF中,我有以下内容:
<ListView.View>
<GridView>
<GridViewColumn
Width="Auto"
DisplayMemberBinding="{Binding SomeProperty, Mode=OneWay}"
Header="Type"/>
问题是,这只会将列自动调整为可见内容。双击标题分隔符时也是如此。
我希望它根据所有内容调整列的大小。相比之下,将Winforms DataGridView
等效于当前的自动调整大小行为以及等效于所需行为:
this.dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; // Current behavior
this.dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; // Desired behavior
这对WPF ListView
是否可行?
此问题与How to autosize and right-align GridViewColumn data in WPF?和其他人不同,因为它们仍会触发当前可见内容的调整大小行为,并且不会解决所有内容。
答案 0 :(得分:1)
问题是ListView
默认启用了虚拟化ItemsPanel
。在此模式下,仅呈现可见内容,然后将触发自动调整大小列。因此,如果您的ListView
中没有多项内容,则可以通过附加属性VirtualizingStackPanel.IsVirtualizing
关闭虚拟化模式,然后它可以正常运行:
<ListView VirtualizingStackPanel.IsVirtualizing="false">
<!-- ... -->
</ListView>
如果您不想关闭虚拟化,那么我认为没有一些简单的方法可以利用Width="Auto"
。您可能必须自己手动实现该功能。从技术上讲,我们需要了解最大宽度,以相应地更新列的宽度。每次我们需要更新列的宽度时,我们可以制作一些for循环,但这很昂贵。每当一个单元格的内容发生变化时,我们也可以设法存储最大的宽度(这是更好的方法)。无论如何,手动操作都是一种痛苦。