2016-03-22 5 views
1

Betrachten Sie das folgende XAMLBinden an Alter von Itemscontrol in Items

<ItemsControl ItemsSource="{Binding Path=MyItems, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" AlternationCount="999" > 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding Path=(ItemsControl.AlternationIndex), 
             RelativeSource={RelativeSource TemplatedParent}, 
             FallbackValue=FAIL, 
             StringFormat={}Index is {0}}" /> 
       <ItemsControl ItemsSource="{Binding Path=MySubItems, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}, AncestorLevel=1}, Path=(ItemsControl.AlternationIndex)}"/> 
           <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}, AncestorLevel=2}, Path=(ItemsControl.AlternationIndex)}"/> 
          </StackPanel> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Es gibt drei TextBlock- Knoten. Der 1. TextBlock ist ein direktes Kind des 1. ItemsControl und zeigt wie erwartet den AlternationIndex. Allerdings benötige ich diesen AlternationIndex eine Stufe tiefer, in der zweiten ItemsControl. Daher kann ich TemplatedParent nicht verwenden und dachte, ich könnte den Ancestor mit AncestorLevel finden. Beide TextBlock-Knoten im 2. ItemsControl zeigen jedoch "0" an.

Was ich vermisse ich? Wie richte ich das 1. ItemsControl aus dem 2. ItemsControl heraus?

Antwort

3

Der AlternationIndex wird nicht auf dem ItemsControl, sondern auf jedem seiner untergeordneten Elemente stehen. Mit DataTemplate speichert Ihr ItemsControl alle untergeordneten Elemente in einem ContentPresenter, der den AlternationIndex enthält. Was Sie ändern müssen:

<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}, AncestorLevel=2}, Path=(ItemsControl.AlternationIndex)}"/> 
<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}, AncestorLevel=2}, Path=(ItemsControl.AlternationIndex)}"/> 
Verwandte Themen