Ширина столбца привязки данных - PullRequest
10 голосов
/ 16 февраля 2012

У меня есть две таблицы данных с одним столбцом каждый.Первый:

<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 ]

14 голосов
/ 16 февраля 2012

Поскольку DataGrid столбцы являются абстрактными объектами, которые не появляются в логическом или визуальном дереве вашего окна.Вы не можете привязать свойства к ним, используя ElementName (для этих привязок не будет именной области, которая необходима).

Вместо этого вы можете попробовать использовать Source и x:Reference, например:

{Binding Source={x:Reference TextCol01}, Path=ActualWidth}
1 голос
/ 17 октября 2017

Как сказал HB, это свойство не находится в логическом или визуальном дереве.

Также взгляните на этот подход на основе связующего прокси.

SourceCode

<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

0 голосов
/ 08 июля 2015

Я искал что-то вроде этого.Я нашел решение, поэтому выкладываю его, чтобы помочь другому человеку с такой же проблемой.

В моей реализации я использую пользовательский шаблон данных для заголовка DataGridTextColumn !!

Таким образом, присваивая Width="{Binding ActualWidth, RelativeSource={RelativeSource Mode=TemplatedParent}}" TextBlock, используемому как DataGridColumnHeader, я могу установить Width на DataGridTextColumn ActualWidth

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...