2010-11-14 4 views
0

J'ai un ListBox avec des styles personnalisés appliqués. Il semble parfois, lorsque je sélectionne une couleur puis une autre (ne pas appuyer sur Ctrl/Shift), il semble que 2 articles sont sélectionnés, parfois même plusWPF: Plus de 1 éléments rendus en tant que sélectionnés dans un contrôle ListBox?

alt text

Ce qui est avec ce rendu? Mon XAML ressemble

<ListBox ItemsSource="{Binding ThemeColors}" SelectedValue="{Binding Color}" SelectionChanged="ListBox_SelectionChanged" ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel Margin="3" /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Padding" Value="0" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
         <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" Padding="1"> 
          <Rectangle Width="20" Height="20"> 
           <Rectangle.Fill> 
            <SolidColorBrush Color="{Binding}" /> 
           </Rectangle.Fill> 
          </Rectangle> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="true"> 
           <Setter Property="BorderBrush" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
          </Trigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsSelected" Value="true"/> 
            <Condition Property="Selector.IsSelectionActive" Value="false"/> 
           </MultiTrigger.Conditions> 
           <Setter Property="BorderBrush" TargetName="Bd" Value="#FF999999"/> 
          </MultiTrigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

MISE À JOUR: Nov 14

donc j'ai suivi @Meleak conseils et enlevé tous les doublons, il arrive d'être quelques-uns. Mais maintenant, avez un autre problème. Parfois, lorsque je sélectionne une couleur, la bordure ne s'affiche pas, le style IsSelected n'est pas actif? Mais la couleur d'aperçu se met à jour, montrant que la liaison a fonctionné.

http://screenr.com/18c

+0

Est-ce que cela arrive à chaque fois pour ces couleurs particulières? Pouvez-vous poster votre code derrière/afficher les modèles? –

+0

Oui le code derrière de cette application est en fait le modèle de vue ... http://pastebin.com/p5McmADR –

Répondre

1

Je pense que vous rencontrez exactement le même problème que Gishu a en this question. Fondamentalement, Color est une structure et non une classe et quand vous sélectionnez une couleur qui est représentée plus d'une fois dans votre ListBox, la sélection échouera car elle n'a aucun moyen de faire la différence entre les deux. Exemple, égal devient vrai.

Color color1 = Colors.AliceBlue; //#FFF0F8FF 
Color color2 = Color.FromArgb(255, 240, 248, 255); //#FFF0F8FF 
bool equal = (color1 == color2); 

Je peux penser à trois solutions à votre problème.

  1. Supprimer les doublons de ThemeColors
  2. Modifier la collection à SolidColorBrush (qui est une classe et non struct) et Bind à la couleur.
  3. Créez votre propre classe de couleurs, par ex. MyColor.
+1

Cela a été mon expérience du même problème aussi. Je mettrais un vote pour # 3, et ne pas écraser les égalités, de cette façon la liste utilise l'égalité de référence, ce qui est ce que vous voulez –

+0

Cela fonctionne, mais maintenant, je remarque que lorsque je sélectionne une couleur, le Le style IsSelected n'apparaît pas. voir "UPDATE: 14 Nov" –

+0

Je n'arrive pas à reproduire votre problème. J'ai utilisé le ListBox que vous avez posté et quand je supprime tous les doublons alors tout fonctionne bien. Je vous suggère d'essayer l'une des deux autres options car elles n'ont pas le problème de struct. –

Questions connexes