GridViewColumn.Width 绑定和 double-click 自动调整列
GridViewColumn.Width binding and double-click to autosize column
像这样绑定列宽
<ListView ...>
<ListView.View>
<GridView>
<GridViewColumn Width="{Binding Width, Mode=TwoWay}" ... />
... more columns
</GridView>
</ListView.View>
</ListView>
问题:当双击列header 行(自动调整列大小)时,不会触发Width
setter,这意味着绑定源在此类列宽更改后不会更新。正常的列大小调整没有问题。
建议?
我不想prevent double-click autosizing,只是为了解决一个问题。
查看 double click handler source code, it looks like the Width
property should be updated. Perhaps something is going wrong in the binding? You might want to make your binding verbose 并查看输出 window 中打印的内容。
撇开这个问题不谈,您可能无法通过绑定到 Width
属性 获得您想要的行为。从 double click handler 可以看出,它被设置为 NaN
以使列自动调整大小。这意味着即使你的 属性 setter 被调用,它也会被 NaN
传递给它。您可以使用 OneWayToSource
绑定模式绑定到 ActualWidth
,除非您出于其他原因确实需要绑定 TwoWay
。
我更愿意删除我的问题,但也许它对犯同样错误的其他人有用(我怀疑)。
问题出在 Width
类型上。我使用了 int
,它似乎完美无缺。但无论出于何种原因,它都不适用于双击调整大小。
修复:使用 double Width {get; set;}
绑定,而不是 int
。
就我而言,我已经解决了这个问题:
1。
我有一个 属性“_gridView”,它是代表名称为“_listView”的 ListView 视图的 GridView 对象。
<ListView x:Name="_listView">
<ListView.View>
<GridView x:Name="_gridView">
<GridViewColumn Header="Whatever"/>
</GridView >
</ListView.View>
</ListView>
2。
我添加了另一段代码来更新 GridView 列的宽度。这是基于 this .NET reference of GridViewColumnHeader.
private void UpdateWidths()
{
foreach (var column in this._gridView.Columns)
{
column.Width = column.ActualWidth;
column.Width = Double.NaN;
}
}
3。
在 WPF window 的构造函数中,我插入了其他代码以在每次“_listView”的 "ItemsSource" 更改时执行宽度更新。:
public MainWindow()
{
InitializeComponent();
DependencyPropertyDescriptor
.FromProperty(ListView.ItemsSourceProperty, typeof(ListView))
.AddValueChanged(_listView, (s, e) => {
UpdateWidths();
});
}
4。
因此,每次我更改对象“_listView”的 "ItemsSource" 属性 时,所有列都会更新。
_listView.ItemsSource = __New value__
像这样绑定列宽
<ListView ...>
<ListView.View>
<GridView>
<GridViewColumn Width="{Binding Width, Mode=TwoWay}" ... />
... more columns
</GridView>
</ListView.View>
</ListView>
问题:当双击列header 行(自动调整列大小)时,不会触发Width
setter,这意味着绑定源在此类列宽更改后不会更新。正常的列大小调整没有问题。
建议?
我不想prevent double-click autosizing,只是为了解决一个问题。
查看 double click handler source code, it looks like the Width
property should be updated. Perhaps something is going wrong in the binding? You might want to make your binding verbose 并查看输出 window 中打印的内容。
撇开这个问题不谈,您可能无法通过绑定到 Width
属性 获得您想要的行为。从 double click handler 可以看出,它被设置为 NaN
以使列自动调整大小。这意味着即使你的 属性 setter 被调用,它也会被 NaN
传递给它。您可以使用 OneWayToSource
绑定模式绑定到 ActualWidth
,除非您出于其他原因确实需要绑定 TwoWay
。
我更愿意删除我的问题,但也许它对犯同样错误的其他人有用(我怀疑)。
问题出在 Width
类型上。我使用了 int
,它似乎完美无缺。但无论出于何种原因,它都不适用于双击调整大小。
修复:使用 double Width {get; set;}
绑定,而不是 int
。
就我而言,我已经解决了这个问题:
1。 我有一个 属性“_gridView”,它是代表名称为“_listView”的 ListView 视图的 GridView 对象。
<ListView x:Name="_listView">
<ListView.View>
<GridView x:Name="_gridView">
<GridViewColumn Header="Whatever"/>
</GridView >
</ListView.View>
</ListView>
2。 我添加了另一段代码来更新 GridView 列的宽度。这是基于 this .NET reference of GridViewColumnHeader.
private void UpdateWidths()
{
foreach (var column in this._gridView.Columns)
{
column.Width = column.ActualWidth;
column.Width = Double.NaN;
}
}
3。 在 WPF window 的构造函数中,我插入了其他代码以在每次“_listView”的 "ItemsSource" 更改时执行宽度更新。:
public MainWindow()
{
InitializeComponent();
DependencyPropertyDescriptor
.FromProperty(ListView.ItemsSourceProperty, typeof(ListView))
.AddValueChanged(_listView, (s, e) => {
UpdateWidths();
});
}
4。 因此,每次我更改对象“_listView”的 "ItemsSource" 属性 时,所有列都会更新。
_listView.ItemsSource = __New value__