Question

J'ai créé un ListBox portant le titre en WPF afin qu'il soit rendu sous la forme d'une liste de cases à cocher.

Quand je POPULATE les éléments de la zone de liste manuellement, le style fonctionne parfaitement. Cependant, lorsque je lie à la place du ItemsSource de la zone de liste à une ressource statique (un ItemsControl contenant les éléments nécessaires), le style est complètement supprimée.

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 affiche correctement le style:

<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 peut aider - Je suis assez nouveau pour tout cela et ai essayé tout ce que je peux penser, mais tout ce que j'ai lu me porte à croire que la mise en ItemsSource devrait avoir le même résultat que le réglage des éléments manuellement, donc Je ne vois aucune raison pour laquelle cela ne fonctionnerait pas.

Merci,

Était-ce utile?

La solution

Modifier les Style.Resources à définir la propriété de 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 Styles dans le style, l'un de ceux de style seront ignorés. Vous pouvez également définir les ressources de style dans les ressources pour les parents ..

Hope this helps!

Autres conseils

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 par exemple). Cela signifie que votre type de cible doit être int au lieu de ListBoxItem.

Vous pouvez également ne spécifiez pas un type de cible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top