2010-10-21 8 views
0

Je rencontre des problèmes avec la liaison de données à l'intérieur d'un UserControl lors de l'utilisation d'un ItemsControl qui a une ItemsSource. Mon Eventtrigger n'est jamais appelé.Liaison de données imbriquée MVVM

Je pense que le problème est que quand je l'appelle mon EventTrigger dans la ligne:

<cmd:EventToCommand Command="{Binding ElementName=layoutroot, Path=DataContext.Checked}" /> 

il essaie de trouver l'événement contrôlé dans la collecte CheckBoxes parce que j'ai mis mon ItemsSource, alors qu'il devrait chercher dans sa parent . J'ai cherché une solution pendant des jours, mais aucun d'entre eux ne semble fonctionner.

Mon code ressemble à ceci:

<Grid x:Name="layoutroot"> 
      <ItemsControl x:Name="itemcontrol" ItemsSource="{Binding CheckBoxes}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Vertical"></StackPanel> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <s:SurfaceCheckBox Background="White" Foreground="White"> 
          <i:Interaction.Triggers> 
           <i:EventTrigger EventName="Checked"> 
            <cmd:EventToCommand Command="{Binding ElementName=layoutroot, Path=DataContext.Checked}" /> 
           </i:EventTrigger> 
          </i:Interaction.Triggers> 
         </s:SurfaceCheckBox> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </Grid> 

Lorsque je tente le code suivant cela fonctionne exactement comme prévu:

<Grid x:Name="layoutroot"> 
    <s:SurfaceCheckBox Background="White" Foreground="White" Content="{Binding Content}" > 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Checked"> 
       <cmd:EventToCommand Command="{Binding ElementName=layoutroot, Path=DataContext.Checked}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </s:SurfaceCheckBox> 
</Grid> 

Mais je vraiment besoin de ce comportement à l'intérieur d'un ItemsControl avec un ensemble ItemsSource.

Des idées?

Répondre

1

La liaison à l'intérieur d'un ItemsControl est placée sur l'article actuel de la collection. Ce que vous devez faire est de rechercher le parent, et Bind à partir de là.

pour cette solution à l'intérieur de votre ItemsControl, en remplacement MyUserControlName:

<cmd:EventToCommand Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyUserControlName} }, Path=DataContext.Checked}" /> 
+0

Merci pour la réponse. J'ai compris qu'il y avait une autre couche sur mes cases à cocher, c'est pourquoi mes événements n'ont pas été déclenchés. – Marc

Questions connexes