我想从一个选项卡控件外部绑定到它的内部。原则上,它的工作时间是一样长的,但是当我使用ContentTemplate时,我不知道如何处理绑定目标。
下面的代码有两对TextBlock和TabItem。第一个块工作,第二个块,使用ContentTemplate不工作。
<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>发布于 2020-08-19 12:57:05
您永远不能从任何模板的外部绑定到它的内部。这是完全不同的范围。
“我怎么可能知道呢?当一个人可以将元素绑定在一起时,什么时候不能结合在一起?这让我感到惊讶的是,这种绑定是不可能的。”
你不应该感到惊讶。如果您了解模板是如何工作的,那么您就会知道第二个绑定不能工作。
第一个示例绑定到一个控件,其中绑定目标和源共享一个共同的显像管。模板--例如,DataTemplate或ControlTemplate --总是有它自己的显像管,因为它描述了一个动态的可视子树。
想想看:一个DataTemplate,定义为ItemsControl的项目模板,并包含一个名为"TemplateElement“的元素,将应用于该ItemsControl的每个项。
如果模板不能定义自己的独立显像管,那么就会有多个同名的元素--在同一个名称的显像管中。假设这是合法的,绑定表达式“如何知道”绑定使用哪些重复元素作为其源?从命名的角度来看,它们是重复的,但在其内容上却是独一无二的。这应该清楚地表明,它永远不会起作用。
DataTemplate不是项目。这是多个项目的建设蓝图。由于这种多样性,不可能从模板外部绑定到该模板的元素。ControlTemplate也是如此。
此外,最重要的是,模板是可视树的一部分,而不是逻辑树。在Binding.ElementName的情况下,除了显像管之外,这也是为什么在模板之外定义的Binding不能解析源的主要原因,如果源本身是模板的一部分。Binding.RelativeSource表达式只遍历逻辑树。这意味着Binding永远找不到组合元素的内部(可视树),而只能找到直接的顶层元素(逻辑树)。
https://stackoverflow.com/questions/63471955
复制相似问题