Domanda

Ho creato nello stile di un ListBox in WPF in modo che sia visualizzato come un elenco casella di controllo.

Quando io popolo elementi della ListBox manualmente, lo stile funziona perfettamente. Tuttavia, quando ho invece impegnare l'ItemsSource della ListBox a una risorsa statica (un ItemsControl contenente gli elementi richiesti), lo stile è completamente abbandonato.

Ecco lo stile:

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

Ecco il codice per la ListBox che mostra lo stile in modo corretto:

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

Ecco il codice per la ListBox che ignora lo stile:

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

Nella speranza che qualcuno possa aiutare - Sono abbastanza nuovo a tutto questo e ho provato tutto quello che mi viene in mente, ma tutto quello che ho letto mi porta a credere che l'impostazione ItemsSource dovrebbe avere lo stesso risultato come impostare le voci manualmente, in modo da non vedo alcuna ragione per cui questo non avrebbe funzionato.

Grazie,

A

È stato utile?

Soluzione

Modificare le Style.Resources a impostare la proprietà ItemContainerStyle e dovrebbe funzionare come un fascino.

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

Nelle versioni più vecchie (prima SP1), quando si definiscono Styles in stile, uno di quelli stile saranno ignorati. In alternativa, è possibile impostare le risorse di stile nelle risorse genitore ..

Spero che questo aiuti!

Altri suggerimenti

Questo è perché il vostro TargetType nel CheckListBoxStyle è rivolti ad un ListBoxItem, ma quando si imposta la proprietà ItemSource della ListBox si sono vincolanti a un elenco di altri elementi (INT per esempio). Questo significa che il tipo di destinazione dovrebbe essere int invece di ListBoxItem.

In alternativa non specificare un tipo di destinazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top