Pregunta

He creado labrado un ListBox en WPF para que se representa como una lista casilla de verificación.

Cuando pueblan elementos del cuadro de lista manualmente, el estilo funciona perfectamente. Sin embargo, cuando en vez de obligar a la ItemsSource del ListBox a un recurso estático (un ItemsControl que contiene los elementos necesarios), el estilo está completamente cayó.

Esto es el estilo:

<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>

Este es el código para el cuadro de lista que muestra el estilo correctamente:

<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>

Este es el código para el cuadro de lista que ignora el estilo:

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

Con la esperanza de que alguien pueda ayudar - Estoy bastante nuevo en todo esto y he intentado todo lo que ocurre, pero todo lo que he leído me lleva a creer que el establecimiento ItemsSource debe tener el mismo resultado que el establecimiento de los elementos de forma manual, por lo no puedo ver ninguna razón por la que esto no funcionaría.

Gracias,

AT

¿Fue útil?

Solución

Cambiar las Style.Resources a establecer la propiedad ItemContainerStyle y debería funcionar como un encanto.

    <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>

En las versiones más antiguas (antes SP1), cuando se define Styles en el estilo, uno de los estilo será ignorado. Como alternativa, puede configurar los recursos de estilo en los recursos de los padres ..

Espero que esto ayude!

Otros consejos

Esto es porque su TargetType en el CheckListBoxStyle está dirigidas a un ListBoxItem, pero cuando se establece la propiedad ItemSource del ListBox va a enlazar a una lista de otros elementos (Ints por ejemplo). Esto significa que su tipo de destino debe ser int en lugar de ListBoxItem.

Como alternativa no especifique un tipo de destino.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top