WPF - 当ItemsSource绑定时,ListBox忽略样式

3

我在WPF中创建了一个ListBox,并将其样式设置为复选框列表。

当我手动填充ListBox的项时,样式完美地工作。然而,当我将ListBox的ItemsSource绑定到静态资源(包含所需项的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代码:
```html

以下是正确显示样式的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 代码:
```html

以下是忽略样式的 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应该与手动设置项目具有相同的结果,因此我看不出为什么这不起作用。
谢谢,
AT
2个回答

6

将 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中定义样式Style时,其中的一个样式将被忽略。或者,您可以在父资源中设置Style的资源。

希望这有所帮助!


很好-除了你忘记Setter.Value标签之外。除此之外,它似乎可以工作。谢谢! - Andy T

1
这是因为在CheckListBoxStyle中,你的TargetType是针对ListBoxItem的,但是当你设置ListBox的ItemSource属性时,你绑定的是其他元素的列表(例如int)。这意味着你的目标类型应该是int而不是ListBoxItem。
或者,不要指定目标类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接