Связывание с ElementName не работает

Вот 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>

Привязка возвращает ошибку: System.Windows.Data Ошибка: 2: не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента.

Что мне не хватает?

Обновить:

Вот ответ: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

Что здесь происходит? Коллекция Columns - это просто свойство в Datagrid; эта коллекция не находится в логическом (или визуальном) дереве, поэтому DataContext не наследуется, что приводит к тому, что не с чем связываться.

Обновление 2: Хорошая статья о предостережениях DataGrid: http://blogs.msdn.com/b/vinsibal/archive/2009/04/07/5-random-gotchas-with-the-wpf-datagrid.aspx

2 ответа

Решение

Привязка к DataGridColumn за Header абд Visibility свойства нуждаются в особой обработке...

Видеть это...

Привязка столбца данных сетки видимости MVVM

Если вас интересует свойство Count объекта, на который ссылается DataContext, попробуйте использовать регулярную привязку данных:

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

РЕДАКТИРОВАТЬ

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

Другие вопросы по тегам