WPF – ListBox игнорирует стиль, когда ItemsSource привязан
-
20-09-2019 - |
Вопрос
Я создал стиль ListBox в WPF, чтобы он отображался как список флажков.
Когда я заполняю элементы ListBox вручную, стиль работает отлично.Однако когда я вместо этого привязываю ItemsSource ListBox к статическому ресурсу (ItemsControl, содержащему необходимые элементы), стиль полностью удаляется.
Вот стиль:
<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>
Вот код ListBox, который правильно отображает стиль:
<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>
Вот код ListBox, который игнорирует стиль:
<ListBox x:Name="ColumnsList2"
Grid.Column="0"
Grid.Row="0"
Style="{StaticResource CheckBoxListStyle}"
BorderThickness="1"
ItemsSource="{Binding Source={StaticResource Test1}, Path=Items}">
</ListBox>
Надеюсь, кто-то может помочь - я новичок во всем этом и перепробовал все, что мог придумать, но все, что я прочитал, заставляет меня поверить, что установка ItemsSource должна иметь тот же результат, что и установка элементов вручную, поэтому я могу Не вижу причин, почему это не сработает.
Спасибо,
В
Решение
Измените Style.Resources на настройку ItemContainerStyle
свойство, и оно должно работать как шарм.
<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>
В более старых версиях (до SP1) при определении Style
s в стиле, один из этих стилей будет игнорироваться.Альтернативно вы можете установить ресурсы стиля в родительских ресурсах.
Надеюсь это поможет!
Другие советы
Это связано с тем, что ваш TargetType в CheckListBoxStyle нацелен на ListBoxItem, но когда вы устанавливаете свойство ItemSource ListBox, вы привязываетесь к списку других элементов (например, целых чисел).Это означает, что ваш целевой тип должен быть int вместо ListBoxItem.
Альтернативно не указывайте целевой тип.