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 のコードは次のとおりです。

<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 を設定するとアイテムを手動で設定するのと同じ結果になるはずだと思うので、できます。これが機能しない理由がわかりません。

ありがとう、

4

2 に答える 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 より前) では、StyleStyle で s を定義すると、それらのスタイルの 1 つが無視されます。または、親リソースに Style のリソースを設定することもできます。

お役に立てれば!

于 2010-03-16T14:48:40.977 に答える
1

これは、CheckListBoxStyle の TargetType が ListBoxItem をターゲットにしているためですが、ListBox の ItemSource プロパティを設定すると、他の要素 (int など) のリストにバインドされます。これは、ターゲット タイプが ListBoxItem ではなく int であることを意味します。

または、ターゲット タイプを指定しないでください。

于 2010-03-16T14:47:39.127 に答える