WPF 绑定到 DataTemplate 中的 ElementName 有效,但在 Style Setter 中无效

问题描述 投票:0回答:1

谁能告诉我为什么这段代码:

    <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 却不能。

wpf binding controls
1个回答
0
投票

样式设置器不提供名称范围。您当前正在从

Style.Setter
引用
Style
属性的子元素。

Style.Setter
是一个属性,而不是一个对象。如果有意义的话,只有对象可以提供名称范围。层次结构中的下一个对象是
StackPanel
,默认情况下不提供名称范围。

在 WPF 中,只有像

Page
Window
这样的可视根元素定义名称范围。此外,
Style
FrameworkTemplate
也能够提供名称范围,尽管它们的名称范围被特殊对待,因为它们能够存在多次(对于它们应用的每个上下文)。

除此之外,没有对象默认提供名称范围。您可以显式创建名称范围。请参阅 WPF XAML 名称范围 了解有关名称范围的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.