绑定datagrid列宽
我有两个datagrids,每个都有一列。 第一:
第二:
第一列的宽度与第二列的宽度的绑定不起作用。 如果我在代码中这样做:
FilterTextCol01.Width = TextCol01.ActualWidth;
有用。 谁能告诉我为什么第一种方法不起作用?
因为DataGrid
列是抽象对象, 不会出现在窗口的逻辑或可视树中。 您不能使用ElementName
绑定它们的属性(这些绑定不需要名称范围)。
您可以尝试使用Source
和x: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