【问题标题】:C# wpf binding in TabControlTabControl 中的 C# wpf 绑定
【发布时间】:2017-07-18 01:13:27
【问题描述】:

我的应用有问题。 我使用 2 TabControl(主要和次要)。 在我的子控件上,我有 2 个 TabItems。一切正常,但 DataGridTextColumn.Header 绑定仅适用于第一个 TabItem。 显示窗口时(单击按钮后)将窗口 DataContext 设置为 ViewModelClass

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

System.Windows.Data 错误:4:找不到与引用'RelativeSource FindAncestor,AncestorType='System.Windows.Controls.DataGrid',AncestorLevel='1''的绑定源。 BindingExpression:Path=DataContext.Translations.NumberText;数据项=空;目标元素是'TextBlock'(名称='');目标属性是“文本”(类型“字符串”)

这里是代码sn-p:

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

【问题讨论】:

标签: c# wpf binding


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    好的,所以答案是:RelativeSource 不可靠...

    解决方案:

    <UserControl.Resources>
        <local:BindingProxy x:Key="proxy" Data="{Binding}" />
    </UserControl.Resources>
    
    <DataGridTemplateColumn Visibility="{Binding Data.IsVisible, 
        Source={StaticResource proxy},
        Converter={StaticResource BooleanToVisibilityConverter}}">
    
    public class BindingProxy : Freezable
    {
        protected override Freezable CreateInstanceCore()
        {
            return new BindingProxy();
        }
    
        public object Data
        {
            get { return (object)GetValue(DataProperty); }
            set { SetValue(DataProperty, value); }
        }
    
        // Using a DependencyProperty as the backing store for Data.
        // This enables animation, styling, binding, etc...
        public static readonly DependencyProperty DataProperty =
            DependencyProperty.Register("Data", typeof(object), 
            typeof(BindingProxy), new UIPropertyMetadata(null));
    }
    

    找到这个解决方案here

    【讨论】:

      猜你喜欢
      • 2018-04-21
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      相关资源
      最近更新 更多