2012-02-16 15 views
9

że dwa datagrids z jednej kolumny każdy. pierwsze:wiązania kolumny Datagrid

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

drugie:

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

Wiązanie szerokość pierwszej kolumny do szerokości sekundę nie działa. Jeśli robię to w ten sposób: Kod

FilterTextCol01.Width = TextCol01.ActualWidth; 

To działa. Czy ktoś mógłby mi powiedzieć, dlaczego pierwsze podejście nie działa?

Odpowiedz

13

Ponieważ kolumny są obiektami abstrakcyjnymi, które nie są ani pojawiają się w logicznym lub wizualnym drzewie okna. Nie można powiązać właściwości na nich za pomocą ElementName (nie będzie tam nazw, które są potrzebne dla tych powiązań).

Można spróbować użyć Source i x:Reference zamiast, na przykład

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

Czy może być TwoWay wiązania z read-only własności ActualWidth? – Clemens

+0

@Clemens: Woops, oczywiście, że nie. –

+0

@ H.B. wspaniały. Dzięki, że działa. Nigdy bym tego nie odgadł. Jak długo trzeba znać takie głęboko zakopane rzeczy? – manton

0

Szukałem czegoś takiego. Znalazłem rozwiązanie, więc zamieszczam je, aby pomóc innej osobie z tym samym problemem.

W mojej implementacji używam Custom DataTemplate dla nagłówka DataGridTextColumn !!

więc przypisywanie Width="{Binding ActualWidth, RelativeSource={RelativeSource Mode=TemplatedParent}}" do TextBlock używany jako DataGridColumnHeader jestem w stanie ustawić jego Width do DataGridTextColumnActualWidth

0

As H.B. powiedział, że ta właściwość nie jest w logicznym lub wizualnym drzewie.

mają również do obejrzenia tego podejścia opartego na wiążącego pełnomocnika.

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

zobaczyć również https://stackoverflow.com/a/46787502/5381620

Powiązane problemy