首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ControlTemplates时,如何从选项卡控件外部绑定到选项卡控件?

使用ControlTemplates时,如何从选项卡控件外部绑定到选项卡控件?
EN

Stack Overflow用户
提问于 2020-08-18 15:35:14
回答 1查看 49关注 0票数 0

我想从一个选项卡控件外部绑定到它的内部。原则上,它的工作时间是一样长的,但是当我使用ContentTemplate时,我不知道如何处理绑定目标。

下面的代码有两对TextBlock和TabItem。第一个块工作,第二个块,使用ContentTemplate不工作。

代码语言:javascript
复制
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    
    <TextBlock 
        Grid.Row="0"
        Text="{Binding ElementName=redTtextBlock, Path=Text}" 
        Foreground="Red"
        />

    <TabControl Grid.Row="1">
        <TabItem 
            Header="Red header"
            >
            <TextBlock 
                    x:Name="redTtextBlock"
                    Text="Red text"
                    Foreground="Red"
                    />
        </TabItem>
    </TabControl>
    
    <TextBlock 
        Grid.Row="2"
        Text="{Binding ElementName=greenTtextBlock, Path=Text}" 
        Foreground="Olive"
        />

    <TabControl Grid.Row="3">
        <TabControl.Resources>
            <DataTemplate x:Key="template" DataType="TabItem">
                <TextBlock 
                    x:Name="greenTtextBlock"
                    Text="Green text"
                    Foreground="Olive"
                    />
            </DataTemplate>
        </TabControl.Resources>
            <TabItem 
                Header="Green header"
                ContentTemplate="{StaticResource template}">
        </TabItem>
    </TabControl>

</Grid>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-19 12:57:05

您永远不能从任何模板的外部绑定到它的内部。这是完全不同的范围。

“我怎么可能知道呢?当一个人可以将元素绑定在一起时,什么时候不能结合在一起?这让我感到惊讶的是,这种绑定是不可能的。”

你不应该感到惊讶。如果您了解模板是如何工作的,那么您就会知道第二个绑定不能工作。

第一个示例绑定到一个控件,其中绑定目标和源共享一个共同的显像管。模板--例如,DataTemplateControlTemplate --总是有它自己的显像管,因为它描述了一个动态的可视子树。

想想看:一个DataTemplate,定义为ItemsControl的项目模板,并包含一个名为"TemplateElement“的元素,将应用于该ItemsControl的每个项。

如果模板不能定义自己的独立显像管,那么就会有多个同名的元素--在同一个名称的显像管中。假设这是合法的,绑定表达式“如何知道”绑定使用哪些重复元素作为其源?从命名的角度来看,它们是重复的,但在其内容上却是独一无二的。这应该清楚地表明,它永远不会起作用。

DataTemplate不是项目。这是多个项目的建设蓝图。由于这种多样性,不可能从模板外部绑定到该模板的元素。ControlTemplate也是如此。

此外,最重要的是,模板是可视树的一部分,而不是逻辑树。在Binding.ElementName的情况下,除了显像管之外,这也是为什么在模板之外定义的Binding不能解析源的主要原因,如果源本身是模板的一部分。Binding.RelativeSource表达式只遍历逻辑树。这意味着Binding永远找不到组合元素的内部(可视树),而只能找到直接的顶层元素(逻辑树)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63471955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档