WPF - List-Box ignoriert Stil Wenn Itemssource gebunden ist
-
20-09-2019 - |
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
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 Style
s 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.