2017-02-27 82 views
0

我的应用程序出现问题。 我使用2个TabControl(主和子)。 在我的子控件上有2个TabItems。它所有的工作,但DataGridTextColumn.Header绑定只适用于第一个TabItem。 当显示窗口(点击按钮后)时,将DataContext设置为ViewModelClassC#在TabControl中绑定wpf

第二个TabItem没有列名。 绑定错误是:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=DataContext.Translations.NumberText; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')

下面是代码片段:

<TabControl x:Name="ovTcMain"> 
    <TabItem Header="{Binding Translations.CodeBooksText }" TabIndex="0"> 
     <Grid Style="{StaticResource MainGrid}"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="6*" /> 
       <RowDefinition Height="1*" /> 
      </Grid.RowDefinitions> 

      <TabControl x:Name="ovTcOptions" Grid.Row="0" SelectedIndex="{Binding Path=SelectedIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" > 

       <TabItem Header="{Binding Translations.ResortsText}" TabIndex="0" > 
        <DataGrid x:Name="ovTiCostCenters" 
       ItemsSource="{Binding CodeBooks[CostCenter], Mode=TwoWay}" 
       SelectedItem="{Binding SelectedCostCenter, Mode=TwoWay}" 
       ColumnWidth="*" AutoGenerateColumns="False" HorizontalAlignment="Stretch" 
       Visibility="Visible" IsReadOnly="True"> 
         <DataGrid.Columns> 
          <DataGridTextColumn Binding="{Binding Path=Name}" Width="auto"> 
           <DataGridTextColumn.Header> 
            <TextBlock Text="{Binding DataContext.Translations.NumberText, RelativeSource={RelativeSource AncestorType=DataGrid}}"/> 
           </DataGridTextColumn.Header> 
          </DataGridTextColumn> 
          <DataGridTextColumn Binding="{Binding Path=DescriptionTerm}" Width="auto"> 
           <DataGridTextColumn.Header> 
            <TextBlock Text="{Binding DataContext.Translations.TermText, RelativeSource={RelativeSource AncestorType=DataGrid}}"/> 
           </DataGridTextColumn.Header> 
          </DataGridTextColumn> 
         </DataGrid.Columns> 
        </DataGrid> 
       </TabItem> 

       <TabItem Header="{Binding Translations.BuildingsText}" TabIndex="1" > 
        <DataGrid x:Name="ovTiBuildings" 
       ItemsSource="{Binding CodeBooks[Building], Mode=TwoWay}" 
       SelectedItem="{Binding SelectedBuilding, Mode=TwoWay}" 
       ColumnWidth="*" AutoGenerateColumns="False" HorizontalAlignment="Stretch" 
       Visibility="Visible" IsReadOnly="True"> 
         <DataGrid.Columns> 
          <DataGridTextColumn Binding="{Binding Path=Name}" Width="auto"> 
           <DataGridTextColumn.Header> 
            <TextBlock Text="{Binding DataContext.Translations.NumberText, RelativeSource={RelativeSource AncestorType=DataGrid}}"/> 
           </DataGridTextColumn.Header> 
          </DataGridTextColumn> 
          <DataGridTextColumn Binding="{Binding Path=DescriptionTerm}" Width="auto"> 
           <DataGridTextColumn.Header> 
            <TextBlock Text="{Binding DataContext.Translations.TermText, RelativeSource={RelativeSource AncestorType=DataGrid}}"/> 
           </DataGridTextColumn.Header> 
          </DataGridTextColumn> 
         </DataGrid.Columns> 
        </DataGrid> 
       </TabItem> 

你能帮助我如何正确绑定的HeaderText?

+0

阅读这个答案。 http://stackoverflow.com/a/15550109/2672863 –

回答

0

在wpf中,在具有项目的控件中,尤其是如果它们使用虚拟化时,有时wpf引擎不可靠并且无法找到项目的祖先,(我认为是因为该项目的绑定可能在被添加之前被评估到VisualTree)。我在处理TabControls(我认为在您的情况下是错误的),DataGridsListBoxesListViews,甚至ComboBoxes时遇到过这种行为。这是some sort of a bug in the framework。有时它只会向您显示警告和装订作品(就像您的第一件物品一样)。点是,有时RelativeSource绑定是不可靠的。

其中一个解决方法这里描述:

https://stackoverflow.com/a/15494510/891715

它与您所提供和代码正确绑定:

<UserConttrol.Resources> 
     <local:BindingProxy x:Key="proxy" Data="{Binding}" /> 
</UserConttrol.Resources> 
... 
<TextBlock Text="{Binding Data.NumberText, Source={StaticResource proxy}}"/> 
... 
public class BindingProxy : 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)); 
} 
+0

非常感谢你!这很好。 – MarekJ