绑定datagrid列宽

我有两个datagrids,每个都有一列。 第一:

   

第二:

  

第一列的宽度与第二列的宽度的绑定不起作用。 如果我在代码中这样做:

 FilterTextCol01.Width = TextCol01.ActualWidth; 

有用。 谁能告诉我为什么第一种方法不起作用?

因为DataGrid列是抽象对象, 不会出现在窗口的逻辑或可视树中。 您不能使用ElementName绑定它们的属性(这些绑定不需要名称范围)。

您可以尝试使用Sourcex:Reference ,例如

 {Binding Source={x:Reference TextCol01}, Path=ActualWidth} 

我一直在寻找这样的东西。 我找到了一个解决方案,所以我发布它是为了帮助其他人解决同样的问题。

在我的实现中,我使用Custom DataTemplate作为DataGridTextColumn的Header !!

因此,将Width="{Binding ActualWidth, RelativeSource={RelativeSource Mode=TemplatedParent}}"分配给用作DataGridColumnHeader的TextBlock ,我可以将其Width设置为DataGridTextColumn ActualWidth

正如HB所说,这个属性不在逻辑或可视树中。

另请参阅基于绑定代理的此方法。

源代码

          

 class BindingProxy : Freezable { //Override of Freezable protected override Freezable CreateInstanceCore() { return new BindingProxy(); } public object Data { get { return (object)GetValue(DataProperty); } set { SetValue(DataProperty, value); } } public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null)); } public class Column : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected internal void OnPropertyChanged(string propertyname) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyname)); } public DataGridLength Width { get { return m_width; } set { m_width = value; OnPropertyChanged("Width"); } } DataGridLength m_width; } 

另请参阅https://stackoverflow.com/a/46787502/5381620