2016-11-12 2 views
0

J'ai la pièce de code suivanteaccéder à l'index de ItemsControl actuel via une liaison

<ItemsControl x:Name="ItemsControl" ItemsSource="{Binding Offers}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Vertical"></StackPanel> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <wpf:Card Padding="32" Margin="5" d:DataContext="{d:DesignData }"> 
          <StackPanel Margin="0,0,0,-30" Height="107"> 
           <TextBlock 
            Style="{DynamicResource MaterialDesignTitleTextBlock}"> 
            <Run Text="Offer " /> 

           </TextBlock> 
           <TextBlock Text="{Binding CarDescription}" /> 
           <Separator Height="1" Visibility="Hidden" /> 
          <Button Content="Select" 
             Width="72" 
             VerticalAlignment="Bottom" 
             HorizontalAlignment="Right" 
             Margin="0,20,0,0" 
             Command="{Binding SelectOfferCommand}"/> 
         </StackPanel> 
         </wpf:Card> 

        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 

Cela produit un tas de boîtes répétées, tout a un bouton. Chaque fois que je clique sur le bouton, je veux accéder à l'index actuel de la boîte (à partir ItemsSource ItemsControl) et le passer comme un paramètre de commande. Est-il possible de le faire?

+3

Pourquoi? Vous pouvez transmettre l'élément réel auquel l'objet itemTemplate est lié. – XAMlMAX

+0

Ne nommez pas l'objet visuel comme son type. Vous devriez changer le nom de votre ItemsControl à un autre nom par exemple: "ItemsControlOffers". –

+0

@ UçanKartal Pour quelle raison? "ItemsControl" est un nom parfaitement valide ici. – Clemens

Répondre

0

Peut être il sera approprié pour vous d'ajouter index propriété à chaque Offer tout en créant Offers et d'envoyer cet indice OnSelectOfferCommand. Il sera beaucoup plus facile

ps Je pense que je dois expliquer ma réponse: Ma suggestion est non seulement plus facile à réaliser, mais c'est aussi une bonne pratique de séparer la logique des bus de l'interface utilisateur. Dans ce cas, si l'interface utilisateur sera modifiée, les modifications n'auront aucune incidence sur le processus de commande complet.

0

Oui, il est possible de le faire.

<Button Command="{Binding SelectOfferCommand}" 
CommandParameters="{Binding ElementName=ItemsControl,Path=SelectedIndex}" 
/> 
0

Vous pouvez passer le Index courant d'un ItemsControl en utilisant la AlterationIndex.

See more info here

Exemple:

<ItemsControl x:Name="ItemsControl" 
       ItemsSource="{Binding Offers}" 
       AlternationCount="1000"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Vertical"></StackPanel> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <wpf:Card Padding="32" Margin="5" d:DataContext="{d:DesignData }"> 
       <StackPanel Margin="0,0,0,-30" Height="107"> 
        <TextBlock 
         Style="{DynamicResource MaterialDesignTitleTextBlock}"> 
         <Run Text="Offer " /> 

        </TextBlock> 
        <TextBlock Text="{Binding CarDescription}" /> 
        <Separator Height="1" Visibility="Hidden" /> 
       <Button Content="Select" 
         Width="72" 
         VerticalAlignment="Bottom" 
         HorizontalAlignment="Right" 
         Margin="0,20,0,0" 
         Command="{Binding SelectOfferCommand}" 
         CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex)}"/> 
       </StackPanel> 
      </wpf:Card> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl>