WPF FindAncestor绑定

dbo*_*eam 7 wpf binding

关于FindAncestor的一个特别之处让我感到困惑,请看下面的例子:

<Expander.HeaderTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <Label Name="headerLabel"  Content="Show Contents" Padding="0" VerticalAlignment="Center" />
            <Button Name="headerButton" Margin="6,0,0,0" Content="Button" Padding="6,1" />
        </StackPanel>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Expander}}, Path=IsExpanded}" Value="True">
                <Setter TargetName="headerLabel" Property="Content" Value="Hide Contents" />
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</Expander.HeaderTemplate>
Run Code Online (Sandbox Code Playgroud)

我使用上面的xaml来更改我的自定义扩展器标头的文本.我的问题是,当我想在绑定中使用祖先的属性时,我何时才需要显式使用FindAncestor?因为以下三个绑定似乎至少在我的场景中产生相同的结果:

Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Expander}}, Path=IsExpanded}"

Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}}, Path=IsExpanded}" 

Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type Expander}}, Path=IsExpanded}"
Run Code Online (Sandbox Code Playgroud)

我看过很多这三个例子,这只是个人品味的问题吗?

Gaz*_*yer 10

MSDN页面了解该RelativeSource.Mode属性:

如果未明确设置此属性,则设置AncestorType或AncestorType和AncestorLevel属性将隐式将此属性值锁定到FindAncestor.