设置列表框项模板绑定的值

时间:2012-07-02 15:36:54

标签: wpf listbox listboxitem templatebinding itemcontainerstyle

我有这种风格:

<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:

    <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属性。

2 个答案:

答案 0 :(得分:1)

您应该尝试使用相对源绑定,而不是使用TemplateBinding

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

如果您希望使用与ListBox定义的边框不同的边框,则需要向ResourceDictionary添加画笔资源并将其应用于:{/ p>

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

然后在你的模板中:

BorderBrush="{StaticResource MyListBoxItemBorderBrush}"

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

答案 1 :(得分:0)

我不是百分百肯定,但我认为你可能需要一个自定义控件。至少我知道你可以用自定义控件来做到这一点!

如果你创建一个自定义控件,从ListBox扩展,包括你创建的这个样式,你可以在其中创建一个附加属性(类似于ItemBorderColor),你可以绑定到你的边框的BorderColor(实际上,对于一个选择效果,你可能想要在ControlTemplate()上创建一个触发器,它根据“IsSelected”属性将“ItemBorderColor”值应用于边框的BorderColor。

可能有一种纯粹的XAML方法,但我不知道......