2010-03-16 6 views
3

J'ai créé un style ListBox dans WPF afin qu'il soit rendu comme une liste de cases à cocher.WPF - ListBox ignore le style lorsque ItemsSource est lié

Lorsque je remplis les éléments de la ListBox manuellement, le style fonctionne parfaitement. Toutefois, lorsque je lie à la place la ItemsSource de la ListBox à une ressource statique (un ItemsControl contenant les éléments requis), le style est complètement supprimé.

Voici le style:

<Style x:Key="CheckBoxListStyle" TargetType="ListBox"> 
    <Style.Resources> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ListBoxItem"> 
         <Grid Margin="2"> 
          <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto" /> 
            <ColumnDefinition /> 
          </Grid.ColumnDefinitions> 
          <CheckBox IsChecked="{Binding IsSelected, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/> 
          <ContentPresenter 
           Grid.Column="1" 
           Margin="2,0,0,0" /> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Style.Resources> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <WrapPanel Orientation="Vertical" /> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="BorderThickness" Value="0" /> 
    <Setter Property="Background" Value="Transparent" /> 
</Style> 

Voici le code pour la zone de liste qui montre le style correctement:

<ListBox x:Name="ColumnsList" 
      Grid.Column="0" 
      Grid.Row="0" 
      Style="{StaticResource CheckBoxListStyle}" 
      BorderThickness="1">             
      <ListBox.Items> 
       <ListBoxItem>Test</ListBoxItem> 
       <ListBoxItem>Test2</ListBoxItem> 
       <ListBoxItem>Test3</ListBoxItem> 
      </ListBox.Items> 
     </ListBox> 

Voici le code pour le ListBox qui ne tient pas compte du style:

<ListBox x:Name="ColumnsList2" 
      Grid.Column="0" 
      Grid.Row="0" 
      Style="{StaticResource CheckBoxListStyle}" 
      BorderThickness="1" 
      ItemsSource="{Binding Source={StaticResource Test1}, Path=Items}"> 
     </ListBox> 

En espérant que quelqu'un puisse m'aider - je suis assez novice dans tout cela et j'ai essayé tout ce à quoi je pouvais penser, mais tout ce que j'ai lu me porte à croire que la configuration de ItemsSource devrait avoir le même résultat que la configuration manuelle des éléments, donc je ne vois pas pourquoi cela ne fonctionnerait pas.

Merci,

AT

Répondre

6

Modifiez Style.Resources pour définir la propriété ItemContainerStyle et cela devrait fonctionner comme un charme.

<Style x:Key="CheckBoxListStyle" TargetType="ListBox"> 
    <Setter Property="ItemContainerStyle"> 
     <Setter.Value> 
      <Style TargetType="ListBoxItem"> 
       <Setter Property="Template"> 
        <Setter.Value> 
          <ControlTemplate TargetType="ListBoxItem"> 
          <Grid Margin="2"> 
           <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto" /> 
             <ColumnDefinition /> 
           </Grid.ColumnDefinitions> 
           <CheckBox IsChecked="{Binding IsSelected, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/> 
           <ContentPresenter 
            Grid.Column="1" 
            Margin="2,0,0,0" /> 
          </Grid> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <WrapPanel Orientation="Vertical" /> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="BorderThickness" Value="0" /> 
    <Setter Property="Background" Value="Transparent" /> 
</Style> 

Dans les versions plus anciennes (avant SP1), lorsque vous définissez Style s dans le style, l'un de ceux de style seront ignorés. Vous pouvez également définir les ressources de style dans les ressources parentes.

Espérons que cela aide!

+0

Excellent - sauf si vous oubliez le tag Setter.Value. En dehors de cela, cela semble fonctionner. Merci! –

+0

Bon point, je l'ai ajouté dans la réponse :) – Arcturus

1

Ceci est parce que votre TargetType dans le CheckListBoxStyle est destinée à un ListBoxItem, mais lorsque vous définissez la propriété ItemSource de la zone de liste vous liez à une liste d'autres éléments (ints pour Exemple). Cela signifie que votre type de cible doit être int au lieu de ListBoxItem.

Vous ne pouvez pas non plus spécifier un type de cible.

Questions connexes