C# GridViewColumn.Width绑定并双击可自动调整列大小
像这样绑定列宽C# GridViewColumn.Width绑定并双击可自动调整列大小,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,像这样绑定列宽 <ListView ...> <ListView.View> <GridView> <GridViewColumn Width="{Binding Width, Mode=TwoWay}" ... /> ... more columns </GridView> </ListView.View> </ListV
<ListView ...>
<ListView.View>
<GridView>
<GridViewColumn Width="{Binding Width, Mode=TwoWay}" ... />
... more columns
</GridView>
</ListView.View>
</ListView>
... 更多栏目
问题:双击列标题行(自动调整列大小)时,不会触发Width
setter,这意味着更改列宽后绑定源不会更新。正常的列大小调整工作没有问题
建议
我不想这样做,只是为了解决一个问题。查看,似乎应该更新宽度
属性。也许装订有问题?您可能希望查看输出窗口中打印的内容
撇开这个问题不谈,您可能无法通过绑定到
Width
属性来获得所需的行为。从中可以看出,它被设置为NaN
,以使列自动调整大小。这意味着,即使您的属性设置程序被调用,它也将获得传递给它的NaN
。您可以使用OneWayToSource
绑定模式绑定到ActualWidth
,除非出于其他原因,您实际上需要将绑定设置为TwoWay
。我更愿意删除我的问题,但可能对其他犯同样错误的人有用(我怀疑)
问题在于宽度类型。我使用了int
,它似乎可以完美地工作。但无论出于何种原因,双击调整大小都不起作用
修复方法:使用double-Width{get;set;}
绑定到,而不是int
在我的例子中,我通过以下操作解决了问题:
一,。
我有一个属性“\u gridView”,它是gridView对象,表示名为“\u ListView”的ListView的视图
三,。
在WPF窗口的构造函数中,我插入了另一段代码,以便在每次“\u listView”的“ItemsSource”更改时执行宽度的更新:
public MainWindow()
{
InitializeComponent();
DependencyPropertyDescriptor
.FromProperty(ListView.ItemsSourceProperty, typeof(ListView))
.AddValueChanged(_listView, (s, e) => {
UpdateWidths();
});
}
四,。
因此,每次我更改对象“\u listView”的“ItemsSource”属性时,所有列都会更新
_listView.ItemsSource = __New value__
在这种情况下,宽度是多少?确保设置了DataContext,检查输出窗口以获取线索。@MikeEason,在双击之前,一切都正常(通过代码或通过拖动列标题行在两个方向上调整正常的列大小)。确定,宽度是否确实发生了变化?我的意思是,您可以双击,但是如果列的宽度不变,那么绑定属性将不会更新。尝试在属性的集合部分放置一个断点(假设它只是一个CLR属性)以查看它是否命中。它确实会更改。我注意到这个问题,双击设置的宽度并没有被记忆,若我重新启动应用程序,上一个宽度被设置。我做的第一件事就是在setter中设置断点。当你双击并在视觉上改变宽度时,它不会被触发。有趣的观察,谢谢。不幸的是,我需要双向绑定来从代码恢复列宽(当应用程序启动时)。详细绑定非常好,谢谢。您的NaN
观察结果有帮助,确实存在System.Windows.Data错误:7:ConvertBack无法转换值'n。输出窗口中的def.'(键入“Double”),这会导致绑定问题。。到int
,lol。
public MainWindow()
{
InitializeComponent();
DependencyPropertyDescriptor
.FromProperty(ListView.ItemsSourceProperty, typeof(ListView))
.AddValueChanged(_listView, (s, e) => {
UpdateWidths();
});
}
_listView.ItemsSource = __New value__