2015-02-21 4 views
1

Ниже tabitem3 работает нормально.
Я хотел бы уйти от именования элементов управления и передать свойства RelativeSource.RelativeSource Sibling

Код, который терпит неудачу в

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

Ошибки в конвертере зависимости объекта не установлен

расширителем является родственным не предком.
Как я могу найти этого брата (без x: Name)?

<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> 
+0

Просто интересно, почему нет, что использовать именование? – igorushi

+0

@ Gosha Итак, мне не нужно создавать уникальные имена для каждого TabItem. Поэтому я мог бы использовать его под контролем, чтобы он добавил. – Paparazzi

ответ

0

Я не уверен, что Expander - настоящий брат TextBlock. Первый - дочерний элемент заголовка TabItem, первый - дочерний элемент содержимого TabItem.

В любом случае, если вы не хотите использовать именование (действительно, мне тоже этого не нравится), вы можете «подняться» через логическое дерево, ища предка TabItem, а затем вы можете «спуститься», используя правильный путь.

В результате этого связывания:

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

Я надеюсь, что это может помочь вам.

EDIT

Чтобы проверить мои привязки вы можете использовать этот простой 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" /> 
Смежные вопросы