2012-02-16 21 views
9

Tengo dos cuadrículas de datos con una columna cada una. Primero:Ancho de columna de cuadrícula de datos de enlace

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

Segundo:

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

Binding de la anchura de la primera columna a la anchura de la segunda no funciona. Si lo estoy haciendo en el código de esa manera:

FilterTextCol01.Width = TextCol01.ActualWidth; 

funciona. ¿Alguien podría decirme por qué el primer enfoque no funciona?

Respuesta

13

Porque las columnas DataGrid son objetos abstractos que no aparecen en el árbol lógico o visual de la ventana. No puede enlazar propiedades sobre ellos usando ElementName (no habrá ningún namescope que sea necesario para esas vinculaciones).

Puede intentar usar Source y x:Reference en su lugar, p. Ej.

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

¿Puede haber una TwoWay vinculante de la propiedad de sólo lectura ActualWidth? – Clemens

+0

@ Clemens: Woops, por supuesto que no. –

+0

@ H.B. estupendo. Gracias, funciona Nunca lo habría adivinado. ¿Cuánto tiempo uno necesita saber cosas tan profundas? – manton

0

He estado buscando algo como esto. Encontré una solución, así que la estoy publicando para ayudar a otras personas con el mismo problema.

En mi implementación utilizo una plantilla de datos personalizada para el encabezado de DataGridTextColumn !!

Así asignar Width="{Binding ActualWidth, RelativeSource={RelativeSource Mode=TemplatedParent}}" a la TextBlock utilizado como DataGridColumnHeader soy capaz de establecer su Width a la DataGridTextColumnActualWidth

0

Como H. B. dijo que esta propiedad no está en el árbol lógico o visual.

También eche un vistazo a este enfoque basado en un proxy de enlace.

Código Fuente

<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; 
} 

Véase también https://stackoverflow.com/a/46787502/5381620

Cuestiones relacionadas