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>

我的问题是我不知道在使用我的样式时要在 ListBox 上设置哪个属性,以便它的 ListBoxItems 的边框最终具有所需的边框画笔。我也想让这项工作适用于我风格的其他边框画笔。

我希望能够有两个具有相同样式但边框颜色不同的列表框。我有一个列表框:

    <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

而不是使用 aTemplateBinding您应该尝试使用相对源绑定。

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

如果您想拥有与为 定义的边框不同的边框,ListBox那么您需要向您添加一个画笔资源ResourceDictionary并应用它:

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

然后在您的模板中:

BorderBrush="{StaticResource MyListBoxItemBorderBrush}"

如果您需要某些项目具有不同的边框,那么您需要查看StyleSelector

于 2012-07-02T15:53:48.910 回答
0

我不是 100% 确定,但我认为您可能需要一个自定义控件。至少我知道您可以使用自定义控件来做到这一点!

如果您创建一个从 ListBox 扩展的自定义控件,其中包含您创建的这种样式,那么您可以在其中创建一个附加属性(类似于 ItemBorderColor),您可以将其绑定到边框的 BorderColor(实际上,对于选择效果,您可能希望在 ControlTemplate () 上创建一个触发器,该触发器基于“IsSelected”属性将该“ItemBorderColor”值应用于边框的 BorderColor)。

可能有一种纯粹的 XAML 方法可以做到这一点,但我不知道......

于 2012-07-02T15:47:43.617 回答