绑定datagrid列宽

时间:2012-02-16 15:03:39

标签: c# wpf xaml data-binding datagrid

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

<DataGrid.Columns>
   <DataGridTextColumn x:Name="FilterTextCol01" 
                       IsReadOnly="False" 
                       Width="{Binding ElementName=TextCol01, Path=ActualWidth, Mode=TwoWay}" />
</DataGrid.Columns>

第二

<DataGridTextColumn CellStyle="{StaticResource DataGridColumnContentLeft}"
                    local:DataGridUtil.Name="TextCol01"
                    x:Name="TextCol01"
                    Header="TextCol01"
                    SortMemberPath="TextCol01"
                    Binding="{Binding TextCol01}" 
                    Width="Auto" 
                    IsReadOnly="True"/>

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

FilterTextCol01.Width = TextCol01.ActualWidth;

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

3 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:1)

H.B.说这个属性不在逻辑或可视树中。

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

<强>源码

<DataGrid ItemsSource="{Binding Lines}" AutoGenerateColumns="False" >
    <DataGrid.Resources>
        <local:BindingProxy x:Key="proxy" Data="{Binding}"/>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="ProductId1" Binding="{Binding Path=Result[0]}" Width="{Binding Data.Columns[0].Width, Source={StaticResource proxy}, Mode=TwoWay}" />
        <DataGridTextColumn Header="ProductId2" Binding="{Binding Path=Result[1]}" Width="{Binding Data.Columns[1].Width, Source={StaticResource proxy}, Mode=TwoWay}"/>
    </DataGrid.Columns>
</DataGrid>

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

答案 2 :(得分:0)

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

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

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