TabControl中的C#wpf绑定

TabControl中的C#wpf绑定,c#,wpf,binding,C#,Wpf,Binding,我的应用程序有问题。 我使用2个TabControl(主控件和子控件)。 在我的子控件上,我有两个选项卡项。除了DataGridTextColumn.Header绑定只对第一个TabItem起作用外,其他所有功能都正常工作。 显示窗口时(单击按钮后),窗口DataContext设置为ViewModelClass 第二个选项卡项没有列名。 绑定错误为: System.Windows.Data错误:4:找不到引用为“RelativeSource FindAncestor,AncestorType='

我的应用程序有问题。 我使用2个TabControl(主控件和子控件)。 在我的子控件上,我有两个选项卡项。除了DataGridTextColumn.Header绑定只对第一个TabItem起作用外,其他所有功能都正常工作。 显示窗口时(单击按钮后),窗口DataContext设置为ViewModelClass

第二个选项卡项没有列名。 绑定错误为:

System.Windows.Data错误:4:找不到引用为“RelativeSource FindAncestor,AncestorType='System.Windows.Controls.DataGrid',AncestorLevel='1'的绑定源。BindingExpression:Path=DataContext.Translations.NumberText;DataItem=null;目标元素为“TextBlock”(名称=“”);目标属性为“Text”(类型为“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吗?

在wpf中,在包含项的控件中,尤其是在使用虚拟化时,有时wpf引擎不可靠,无法找到项的祖先(我认为,因为项的绑定可能会在添加到
VisualTree
之前进行评估)。在使用
TabControls
(我认为这在您的案例中是错误的)、
DataGrids
listboxs
listview
,甚至是
组合框
时,我遇到过几次这种行为。这是。有时它只向您显示警告,并且绑定仍然有效(就像您的第一项一样)。关键是,有时
相对资源
绑定是不可靠的

此处介绍了一种变通方法:

它与您提供的代码一起工作并正确绑定:

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

...
...
公共类BindingProxy:Freezable
{
受保护的重写Freezable CreateInstanceCore()
{
返回新的BindingProxy();
}
公共对象数据
{
获取{return(object)GetValue(DataProperty);}
set{SetValue(DataProperty,value);}
}
公共静态只读DependencyProperty DataProperty=
DependencyProperty.寄存器(“数据”,类型为(对象),
typeof(BindingProxy),新的UIPropertyMetadata(null));
}

正常,因此asnwer是:
相对资源
不可靠

解决方案:


public类BindingProxy:Freezable
{
受保护的重写Freezable CreateInstanceCore()
{
返回新的BindingProxy();
}
公共对象数据
{
获取{return(object)GetValue(DataProperty);}
set{SetValue(DataProperty,value);}
}
//使用DependencyProperty作为数据的备份存储。
//这将启用动画、样式、绑定等。。。
公共静态只读DependencyProperty DataProperty=
DependencyProperty.寄存器(“数据”,类型为(对象),
typeof(BindingProxy),新的UIPropertyMetadata(null));
}
找到此解决方案

阅读此答案。