Pavel Voronin
Pavel Voronin

Reputation: 13985

Binding with ElementName does not work

Here is the XAML:

<DataGrid Grid.Column="0"  AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Path=Columns}"
              x:Name="ColumnsGrid" RowHeaderWidth="0">
        <DataGrid.Columns>
            <DataGridTextColumn Width="*" Binding="{Binding Path=Header}" 
                                Header="{Binding ElementName=ColumnsGrid, Path=DataContext.Count, StringFormat=Columns ({0}), diag:PresentationTraceSources.TraceLevel=High}"/>
        </DataGrid.Columns>  
    </DataGrid>

Binding returns error: System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element.

What do I miss?

Update:

Here is the answer: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

What is happening here? The Columns collection is just a property in the Datagrid; this collection is not in the logical (or visual) tree, therefore the DataContext is not being inherited, which leads to there being nothing to bind to.

Update 2: Good article about DataGrid's caveats: http://blogs.msdn.com/b/vinsibal/archive/2009/04/07/5-random-gotchas-with-the-wpf-datagrid.aspx

Upvotes: 7

Views: 5671

Answers (2)

Emond
Emond

Reputation: 50672

If you are interested in the Count property of the object that is referred to in the DataContext you try and use regular databinding:

<DataGrid Grid.Column="0"  AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Path=Columns}"
          x:Name="ColumnsGrid" RowHeaderWidth="0">
    <DataGrid.Columns>
        <DataGridTextColumn Width="*" Binding="{Binding Path=Header}" 
                            Header="{Binding Path=Count, StringFormat=Columns ({0}), diag:PresentationTraceSources.TraceLevel=High}"/>
    </DataGrid.Columns>  
</DataGrid>

EDIT

Apparently the columns of a datagrid are not part of the Visual Tree So using ElementName and RelativeSource will not work. Perhaps you should add the property to the object the column is bound to.

Upvotes: 0

Vinit Sankhe
Vinit Sankhe

Reputation: 19885

Binding on DataGridColumn for Header abd Visibility properties needs special treatment...

See this...

Bind datagrid column visibility MVVM

Upvotes: 1

Related Questions