Frage

Ich habe eine ListBox in WPF erstellt Stil, so dass sie als eine Checkbox Liste wiedergegeben wird.

Wenn ich die ListBox Stücke manuell zu füllen, funktioniert das Styling perfekt. Wenn jedoch I statt bind der Itemssource der List-Box auf eine statische Ressource (ein Item die erforderlichen Elemente enthält), wird das Styling vollständig fallen gelassen.

Hier ist der Stil:

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

Hier ist der Code für die ListBox, dass zeigt die Art richtig:

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

Hier ist der Code für die List-Box, die den Stil ignoriert:

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

Hoffnung, jemand kann helfen, - ich bin ziemlich neu für all dies und haben versucht, alles, was ich denken kann, aber alles, was ich habe mich gelesen, führt zu glauben, dass Einstellung Itemssource sollte das gleiche Ergebnis haben wie die Elemente manuell einstellen, so ich kann keinen Grund sehen, warum dies nicht funktionieren würde.

Danke,

AT

War es hilfreich?

Lösung

Ändern Sie die Style.Resources auf die ItemContainerStyle-Eigenschaft und es sollte wie ein Zauber funktionieren.

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

Bei älteren Versionen (vor SP1), wenn Sie Styles in Stil definieren, eines dieses Stils wird ignoriert. Alternativ können Sie die Ressourcen des Stils in den übergeordneten Ressourcen gesetzt ..

Hope, das hilft!

Andere Tipps

Dies ist, weil Ihr Target im CheckListBoxStyle einen ListBoxItem Targeting, aber wenn man die ItemSource Eigenschaft des ListBox setzen Sie auf eine Liste von anderen Elementen (Ints zum Beispiel) sind verbindlich. Dies bedeutet, dass Ihr Zieltyp statt ListBoxItem sein int sollte.

Alternativ keinen Zieltyp angeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top