none
Comment faire un Binding d'un ListBoxItem.IsSelected dans un UserControl ? RRS feed

  • Question

  • Bonjour,
     
    J’ai une ListBox qui affiche ses éléments dans un UserControl.
     
    Pour le moment tous les éléments qu’ils soient sélectionnés ou non
    s’affichent de la même façon.
    Je voudrai quand un élément est sélectionné qu’il soit mis en évidence. Par
    un encadré de couleur par exemple.
     
    J’ai donc ajouté dans mon usercontrol une propriété “Selectionne” de type
    boolean et une bordure qui change de couleur selon la valeur de cette
    propriété 
     
    Mon problème : Comment binder le IsSelected de chaque élément de la ListBox
    dans la nouvelle propriété “Selectionne” du UserControl.
     

    J’ai trouvé une réponse mais c’est pour du WPF (Solution WPF) et elle ne s’applique
    pas en Windows Phone 8.

    Selectionne="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}}"

    “La propriété AncestorType est introuvable dans le type
    RelativeSource”

    <ListBox ItemsSource="{Binding MaListe}" >
    	<ListBox.ItemTemplate>
    		<DataTemplate>
                    	<local:MyUserControl Width="140" Height="180" MyData="{Binding}" 
    Selectionne="{Binding Path=IsSelected RelativeSource={ ? }" />
    		</DataTemplate>
    	</ListBox.ItemTemplate>
    </ListBox>
    Merci.


    mercredi 6 novembre 2013 21:26

Réponses

Toutes les réponses

  • Salut.

    Je suppose que ton premier but qui t'a mené à faire tout ça c'est de changer l'apparence des éléments sélectionnés dans ta liste. Il y a en fait une façon plus simple et mieux adaptée à ce que tu veux faire: Utiliser le visual state manager et modifier le state "Selected". Regarde ici pour un exemple : http://stackoverflow.com/questions/9770399/change-the-style-of-the-selecteditem-in-list-box
    • Modifié PiRhAnAs mercredi 6 novembre 2013 22:31
    • Proposé comme réponse Loukt mercredi 6 novembre 2013 22:46
    • Marqué comme réponse Pedalo Production dimanche 10 novembre 2013 14:02
    mercredi 6 novembre 2013 22:31
  • Bonjour

    Avez-vous des nouvelles pour nous?

    Merci!

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    vendredi 8 novembre 2013 07:18
  • Non pas déjà !

    Je vous dirai...

    vendredi 8 novembre 2013 22:42
  • Bonjour,

    Merci pour les réponses.

    Ça marche mais ça ne fait pas exactement ce que je voulais faire. Avec l'exemple j'ai réussi à encadrer l'élément sélectionné avec une bordure mais pas à modifier l'apparence interne de l''élément. Si je trouve je mettrai la solution.

    dimanche 10 novembre 2013 14:02
  • Bonjour,

    Voila comment j'ai fait.

    Dans ListBox.ItemContainerStyle j'ai un storyboard sur le VisualState "Selected" qui modifie la propriété IsSelected du UserControl.
    Le UserControl fait maintenant partie du ItemContainerStyle et n'est plus dans le ItemTemplate.
    IsSelected est une DependencyProperty du UserControl
    Le UserControl réagit au changement de sa propriété IsSelected car j'ai mis une procédure ChangedCallback dans les Metadata de la DependencyProperty.
    Dans cette procédure je modifie l'aspect du UserControl.

                    <ListBox x:Name="ListBoxAccords"
                                 Grid.Row="1"
                                 SelectionMode="Single"
                                 ItemsSource="{Binding ListeAccords}"
                                 SelectedIndex="{Binding IndexAccordEnCours, Mode=TwoWay}">
    
                        <ListBox.ItemContainerStyle>
                            <Style TargetType="ListBoxItem">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="ListBoxItem">
                                            <Grid Background="{TemplateBinding Background}">
                                                <vsm:VisualStateManager.VisualStateGroups>
                                                    <vsm:VisualStateGroup x:Name="SelectionStates">
                                                        <vsm:VisualState x:Name="Unselected" />
                                                        <vsm:VisualState x:Name="Selected">
                                                            <Storyboard>
                                                                <!--<DoubleAnimationUsingKeyFrames Storyboard.TargetName="myUserControl"
                                                                                               Storyboard.TargetProperty="Opacity"
                                                                                               Duration="0">
                                                                    <DiscreteDoubleKeyFrame KeyTime="0" Value="1" />
                                                                </DoubleAnimationUsingKeyFrames>-->
                                                                <ObjectAnimationUsingKeyFrames Storyboard.TargetName="myUserControl" 
                                                                                               Storyboard.TargetProperty="(IsSelected)">
                                                                    <DiscreteObjectKeyFrame KeyTime="0" Value="True" />
                                                                </ObjectAnimationUsingKeyFrames>
                                                            </Storyboard>
                                                        </vsm:VisualState>
                                                    </vsm:VisualStateGroup>
                                                </vsm:VisualStateManager.VisualStateGroups>
                                                <!--<ContentPresenter x:Name="contentPresenter"
                                                                  Content="{TemplateBinding Content}"
                                                                  ContentTemplate="{TemplateBinding ContentTemplate}"
                                                                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"                             
                                                                  Margin="{TemplateBinding Padding}" 
                                                                  Opacity="0.5"/>-->
                                                <!--<Border BorderBrush="{StaticResource PhoneAccentBrush}" BorderThickness="1" x:Name="ImageBorder" Visibility="Collapsed"/>-->
                                                <local:UserControlAccord x:Name="myUserControl" Opacity="1" Largeur="180" Hauteur="190" 
                                                                         Accord="{Binding}"/>
                                            </Grid>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </ListBox.ItemContainerStyle>
    
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <!--<local:UserControlAccord Width="140" Height="180" Accord="{Binding}" />-->
                            </DataTemplate>
                        </ListBox.ItemTemplate>
    
                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <toolkit:WrapPanel />
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>
    
    
                    </ListBox>

    lundi 24 mars 2014 23:15