GridViewColumn.宽度绑定,双击可自动调整列的大小

本文关键字:调整 绑定 双击 GridViewColumn | 更新日期: 2023-09-27 17:54:49

像这样绑定列宽度

<ListView ...>
    <ListView.View>
        <GridView>
            <GridViewColumn Width="{Binding Width, Mode=TwoWay}" ... />
            ... more columns
        </GridView>
    </ListView.View>
</ListView>

问题:当双击列标题行(自动调整列的大小)没有触发Width setter,这意味着绑定源在这样的列宽度改变后没有更新。正常的列大小调整没有问题。

建议吗?

我不想阻止双击自动调整大小,只是为了修复一个问题。

GridViewColumn.宽度绑定,双击可自动调整列的大小

查看双击处理程序源代码,看起来应该更新Width属性。也许是装订出了什么问题?您可能希望将绑定设置为详细的,并查看输出窗口中打印的内容。

撇开这个问题不谈,绑定到Width属性可能无法获得想要的行为。从双击处理程序可以看出,它被设置为NaN以使列自动调整大小。这意味着即使你的属性设置器被调用,它也会得到传递给它的NaN。您可以使用OneWayToSource绑定模式绑定到ActualWidth,除非由于其他原因实际上需要绑定到TwoWay

在我的例子中,我已经解决了这个问题:

1。我有一个属性"_gridView",它是GridView对象,表示ListView的视图,其名称为"_listView"。

<ListView x:Name="_listView">
    <ListView.View>
        <GridView x:Name="_gridView">
            <GridViewColumn Header="Whatever"/>
        </GridView >
    </ListView.View>
</ListView>

2。我添加了另一段代码来更新GridView列的宽度。这是基于。net对GridViewColumnHeader的引用。

private void UpdateWidths()
{
    foreach (var column in this._gridView.Columns)
    {
        column.Width = column.ActualWidth;
        column.Width = Double.NaN;
    }
}

3。在WPF窗口的构造函数中,我插入了其他代码来执行每次"_listView"的"ItemsSource"更改时的宽度更新:

public MainWindow()
{
    InitializeComponent();
    DependencyPropertyDescriptor
        .FromProperty(ListView.ItemsSourceProperty, typeof(ListView))
        .AddValueChanged(_listView, (s, e) => {
            UpdateWidths();
    });
}

4。因此,每次我更改对象"_listView"的"ItemsSource"属性时,所有列都会更新。

_listView.ItemsSource = __New value__

我宁愿删除我的问题,但也许它会对犯同样错误的人有用(我怀疑)。

问题是Width类型。我使用int,它似乎工作完美无缺。但是不管什么原因,双击调整大小就不行。

修改:使用double Width {get; set;}绑定,而不是int