2013-06-25 5 views
1

У меня, похоже, возникают проблемы с попыткой связать столбец заголовка DataGridTextColumn. Этот код отлично работает, когда у меня нет TabControl/TabItem, который обертывает его, но когда я помещаю его в TabControl, он больше не может найти DayHeader. Я предполагаю, что это проблема с FindAncestor/AncestoryType, но я не уверен, что делать, чтобы исправить это, или если это действительно проблема. Любая помощь будет оценена по достоинству.Ошибка привязки заголовка DataGridTextColumn в TabItem/TabControl

<!--Not Working 
<TabControl Margin="0,25,0,0" Background="{x:Null}"> 
    <TabItem > 
     <Grid > 
      <DataGrid></DataGrid> 
     </Grid> 
    </TabItem> 
    <TabItem Header="Test Header">--> 

<!--Working--> 
<Grid> 
    <DataGrid ItemsSource="{Binding RunningViewSource.View}" Margin="0,27,0,-5" SelectionMode="Single"> 
     <DataGrid.ItemsPanel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel VirtualizingStackPanel.VirtualizationMode="Recycling" /> 
      </ItemsPanelTemplate> 
     </DataGrid.ItemsPanel> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Contingencies" Binding="{Binding Contingencies}" 
              IsReadOnly="True" Width="400" /> 
      <DataGridTextColumn Binding="{Binding Days[4]}" CellStyle="{StaticResource NumberCell}"> 
       <DataGridTextColumn.Header> 
        <TextBlock Text="{Binding DataContext.DayHeader, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"> 
        </TextBlock> 
        </DataGridTextColumn.Header> 
      </DataGridTextColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

<!--Not Working 
    </TabItem> 
</TabControl>--> 

Это сообщение, которое я получаю в окне вывода, если я добавляю нерабочие части.

Ошибка System.Windows.Data: 4: Не удается найти источник для привязки со ссылкой 'RelativeSource FindAncestor, AncestorType =' System.Windows.Controls.DataGrid ', AncestorLevel =' 1 ''. BindingExpression: Path = DataContext.DayHeader; DataItem = NULL; целевым элементом является «TextBlock» (Name = ''); target свойство is 'Text' (type 'String')

Редактировать: Я могу воспроизвести эту ошибку только в том случае, если у меня есть TabControl с более чем одним TabItem. Я обновил свой код. Извините за любую путаницу, но добавление другого TabItem - это то, что делает DayHeader недоступным.

Edit2: Я знаю, что многие люди используют Snoop, чтобы помочь им связать проблемы. Хорошо, когда я проверяю заголовки столбцов на Snoop, текст волшебным образом появляется, когда я их подсвечиваю. Я понятия не имею, почему это работает так, надеюсь, кто-то, у кого больше знаний о Snoop, сможет помочь. Вот код для доступа к DayHeader и, возможно, это поможет.

//Code Behind 
private string dayHeader; 

    public string DayHeader 
    { 
     get { return dayHeader; } 
     set 
     { 
      dayHeader = value; 
      NotifyOfPropertyChange(() => DayHeader); 
     } 
    } 

Благодарим за любую помощь.

ответ

3

DataGridTextColumn.Header не находится в визуальном дереве, поэтому он не содержит DataContext. Вы можете использовать класс Freezable, как показано в статье this.

+0

Спасибо. Первое предложение - это то, что я уже пробовал, и не печально. Второе предложение дает мне ошибку. Невозможно вызвать MarkupExtension.ProvideValue из-за циклической зависимости. Свойства внутри MarkupExtension не могут ссылаться на объекты, которые ссылаются на результат MarkupExtension. Пораженные MarkupExtensions: System.Windows.Data.Binding – Kohins

+0

Kohins: Я отредактировал ответ, теперь это работа. –

+0

Я не пробовал использовать это, но я замечаю, что если переместить вторую вкладку в первое место, все будет хорошо. Как-то, когда tabitem находится во втором месте, datagrid не подбирает изменения или что-то еще? – Kohins