0

私はこのスタイルを持っています:

<Style x:Key="SelectableListBoxItemStyle" TargetType="{x:Type ListBoxItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">

                <Border Background="Transparent"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        CornerRadius="4"
                        BorderThickness="2"
                        x:Name="IconBorder"
                        Margin="4,2,4,2">
                    <ContentPresenter/>
                </Border>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="true">
                        <Setter TargetName="IconBorder" 
                                Property="BorderBrush" 
                                Value="Blue" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

私の問題は、ListBoxItems の境界線が目的の境界線ブラシを持つことになるようにスタイルを消費するときに、ListBox に設定するプロパティがわからないことです。また、私のスタイルの他の境界線ブラシでもこれを機能させたいと思います。

この同じスタイルで境界線の色が異なる 2 つのリスト ボックスを作成できるようにしたいと考えています。私はリストボックスのためにこれを持っています:

    <ListBox 
        ItemsSource="{Binding SelectedProduct.Pictures}"
        SelectedItem="{Binding SelectedSet, Mode=TwoWay}"
        ItemContainerStyle="{StaticResource ResourceKey= SelectableListBoxItemStyle}">
    </ListBox>

更新..私はこれを試しました:

    <ListBox 
        ItemsSource="{Binding SelectedProduct.Pictures}"
        SelectedItem="{Binding SelectedSet, Mode=TwoWay}">

            <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource SelectableListBoxItemStyle}">
                    <Setter TargetName="IconBorder" Property="BorderBrush" Value="Green" />
                </Style>
            </ListBox.ItemContainerStyle>

        </ListBox>

しかし、私は得る: エラー 8 TargetName プロパティはスタイル セッターに設定できません。

4

2 に答える 2

1

Instead of using a TemplateBinding you should try using a relative source binding.

BorderBrush="{Binding RelativeSource={RelativeSource FindAncestor, 
                                      AncestorType={x:Type Listbox}}, 
                                      Path=BorderBrush}"

If you want to have a different border than that defined for the ListBox then you will need to add a brush resource to your ResourceDictionary and apply that instead:

<Listbox.Resources>
    <SolidColorBrush x:Key="MyListBoxItemBorderBrush" Color="Red"/>
<Listbox.Resources>

and then in your template:

BorderBrush="{StaticResource MyListBoxItemBorderBrush}"

If you need certain items to have different borders then you need to look at a StyleSelector.

于 2012-07-02T15:53:48.910 に答える
0

100% 確実ではありませんが、そのためにはカスタム コントロールが必要になると思います。少なくとも、カスタム コントロールでそれができることはわかっています。

作成したこのスタイルを含む、ListBox から拡張されたカスタム コントロールを作成する場合、その中に添付プロパティ (ItemBorderColor のようなもの) を作成して、境界線の BorderColor にバインドできます (実際には、選択効果のために、 「IsSelected」プロパティに基づいて、その「ItemBorderColor」値を境界線の BorderColor に適用する ControlTemplate () でトリガーを作成することができます)。

それを行う純粋な XAML の方法があるかもしれませんが、私はそれを知りません....

于 2012-07-02T15:47:43.617 に答える