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