RelativeSource兄弟姐妹

时间:2015-02-21 15:44:57

标签: wpf relativesource

tabitem3以下工作正常 我想远离命名控件并通过RelativeSource传递属性。

失败的代码是

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

转换器中的错误是未设置依赖项对象

扩张者是一个不是祖先的兄弟姐妹 我怎样才能找到兄弟姐妹(没有x:姓名)?

<TabItem x:Name="tabitem3" IsSelected="False">
    <TabItem.Header>
        <Expander x:Name="tabexp3" Header="Three" IsHitTestVisible="True"
                  Expanded="expcolp" Collapsed="expcolp" IsExpanded="False"/>
    </TabItem.Header>
    <TextBlock Text="Content Three TabItem" Background="LightBlue" >
        <TextBlock.Visibility>
            <MultiBinding Converter="{StaticResource bvc2}" Mode="OneWay">
                 <Binding ElementName="tabexp3"  Path="IsExpanded"/>
                 <Binding ElementName="tabitem3" Path="IsSelected" />
            </MultiBinding>
        </TextBlock.Visibility>
    </TextBlock>
</TabItem>
<TabItem IsSelected="False">
    <TabItem.Header>
        <Expander Header="Four" IsHitTestVisible="True"
                  Expanded="expcolp" Collapsed="expcolp" IsExpanded="False"/>
    </TabItem.Header>
    <TextBlock Text="Content Four TabItem" Background="LightBlue" >
        <TextBlock.Visibility>
            <MultiBinding Converter="{StaticResource bvc2}" Mode="OneWay">
                 <Binding RelativeSource="{RelativeSource AncestorType={x:Type Expander}}" Path="IsExpanded"/>
                 <Binding RelativeSource="{RelativeSource AncestorType={x:Type TabItem}}"  Path="IsSelected"/>                          
            </MultiBinding>
        </TextBlock.Visibility>
    </TextBlock>
</TabItem>

1 个答案:

答案 0 :(得分:0)

我不确定Expander是TextBlock的真正兄弟。第一个是TabItem标题的子元素,前者是TabItem内容的子元素。

无论如何,如果你不想使用命名(实际上我也不喜欢它),你可以通过查找TabItem祖先“上去”逻辑树然后你可以“下去”通过正确的道路。

结果是这种绑定:

<Binding RelativeSource="{RelativeSource AncestorType={x:Type TabItem}}" Path="Header.IsExpanded" />

我希望它可以帮到你。

修改

要测试我的绑定,您可以使用这个简单的XAML:

<TabControl>
    <TabItem IsSelected="True">
        <TabItem.Header>
            <Expander Header="One" IsHitTestVisible="True" IsExpanded="False"/>
        </TabItem.Header>
        <TabItem.Content>
            <TextBlock Text="Some contents..." />
        </TabItem.Content>
    </TabItem>
    <TabItem IsSelected="False">
        <TabItem.Header>
            <Expander Header="Two" IsHitTestVisible="True" IsExpanded="False"/>
        </TabItem.Header>
        <TabItem.Content>
            <TextBlock>
                <TextBlock.Text>
                    <Binding RelativeSource="{RelativeSource AncestorType={x:Type TabItem}}" Path="Header.IsExpanded" />
                </TextBlock.Text>
            </TextBlock>
        </TabItem.Content>
    </TabItem>
</TabControl>

如果展开/折叠第二个Expander,TextBlock的文本将会更改。 如果TabItem将IsSelected设置为true,则我的绑定不起作用。在这种情况下,您可以通过这种方式扩展我的想法:

<Binding RelativeSource="{RelativeSource AncestorType={x:Type TabControl}}" Path="SelectedItem.Header.IsExpanded" />