Pergunta

Eu criei um estilo de listar no WPF para que ele seja renderizado como uma lista de caixa de seleção.

Quando povoado os itens do ListBox manualmente, o estilo funciona perfeitamente. No entanto, quando ligo a fonte Itens da caixa de listagem a um recurso estático (um itemsControl que contém os itens necessários), o estilo é completamente descartado.

Aqui está o 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>

Aqui está o código para a caixa de listagem que mostra o estilo corretamente:

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

Aqui está o código para a caixa de listagem que ignora o estilo:

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

Esperando que alguém possa ajudar - sou muito novo em tudo isso e já tentei tudo o que consigo pensar, mas tudo o que li me leva a acreditar que o Setting ItsSource deve ter o mesmo resultado que definir os itens manualmente, para que eu possa ' Temos qualquer motivo pelo qual isso não funcionaria.

Obrigado,

NO

Foi útil?

Solução

Mude o estilo.Resources para definir o ItemContainerStyle propriedade e deve funcionar como um 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>

Em versões mais antigas (antes do SP1), quando você define Styleestá em grande estilo, um desses estilo será ignorado. Como alternativa, você pode definir os recursos de estilo nos recursos dos pais.

Espero que isto ajude!

Outras dicas

Isso ocorre porque o seu TargetType no listboxstyle está direcionando um ListBoxItem, mas quando você define a propriedade Itens. Isso significa que seu tipo de destino deve ser int em vez de listboxItem.

Alternativamente, não especifique um tipo de destino.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top