谁能告诉我为什么这段代码:
<Window.Resources>
<DataTemplate x:Key="Content_Test1">
<StackPanel Orientation="Horizontal">
<Button x:Name="Button1">Mouse me</Button>
<TextBlock x:Name="TextBlock1" Margin="2,0,0,0">
HELLO WOLRD
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=Button1, Path=IsMouseOver}" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=Button1, Path=IsMouseOver}" Value="True">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<ContentControl x:Name="contentControl1" ContentTemplate="{StaticResource Content_Test1}">
</ContentControl>
</Grid>
有效。
但是这段代码:
<Grid>
<ContentControl x:Name="contentControl1">
<ContentControl.Style>
<Style TargetType="ContentControl">
<Setter Property="Content">
<Setter.Value>
<StackPanel Orientation="Horizontal">
<Button x:Name="Button1">Mouse me</Button>
<TextBlock x:Name="TextBlock1" Margin="2,0,0,0">
HELLO WOLRD
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=Button1, Path=IsMouseOver}" Value="False"> <!--Look Here-->
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=Button1, Path=IsMouseOver}" Value="True">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
</Setter.Value>
</Setter>
</Style>
</ContentControl.Style>
</ContentControl>
</Grid>
说:
Cannot find source for binding with reference 'ElementName=Button1'
这两个示例中的任务是相同的,但在第二个示例中,Binding 无法找到其自己的相邻元素 Button1 的 ElementName。 所以,我很好奇,在这个特定任务的上下文中,为什么 DataTemplate Binding 可以工作,但 Style Setter Binding 却不能。
样式设置器不提供名称范围。您当前正在从
Style.Setter
引用 Style
属性的子元素。
Style.Setter
是一个属性,而不是一个对象。如果有意义的话,只有对象可以提供名称范围。层次结构中的下一个对象是 StackPanel
,默认情况下不提供名称范围。
在 WPF 中,只有像
Page
或 Window
这样的可视根元素定义名称范围。此外, Style
和 FrameworkTemplate
也能够提供名称范围,尽管它们的名称范围被特殊对待,因为它们能够存在多次(对于它们应用的每个上下文)。
除此之外,没有对象默认提供名称范围。您可以显式创建名称范围。请参阅 WPF XAML 名称范围 了解有关名称范围的更多信息。