XAML ListBox 中 ContainerStyle 和 ContentTemplate 的单独绑定

XAML separate binding of ContainerStyle and ContentTemplate in ListBox

我试了一段时间,在网上搜索没有成功...现在我敢自己在Whosebug上问了。

因此,目的是将 ItemContainerStyleListBoxItemContentTemplate 的定义分开。我在 ResourceDictionary 中定义了 ListBoxItemStyle,在 Window.Resources 中定义了两个不同的 DataTemplates

我现在想根据 ResourceDictionary 中定义的样式设置 ListBoxItem 的样式,并使用触发器 (IsMouseOver) 更改 DataTemplate

我的 (不工作) 代码是这样的:

<ListBox HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="20,60,10,10"
         Grid.Row="1" Grid.Column="0"
         PreviewMouseMove="DragMove_PreviewMouseMove"
         PreviewMouseLeftButtonDown="Drag_PreviewMouseLeftButtonDown"
         ItemsSource="{Binding Persons}" VerticalContentAlignment="Center"
         Style="{StaticResource DefaultListBoxStyle}">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Style" Value="{StaticResource DefaultListBoxItemStyle}"/>
            <Setter Property="ContentTemplate" Value="{StaticResource PersonsListBoxItemTemplate_default}"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="ContentTemplate" Value="{StaticResource PersonsListBoxItemTemplate_infoButtons}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

其中 DefaultListBoxStyleResourceDictionary 中定义的样式,PersonsListBoxItemTemplate_default & PersonsListBoxItemTemplate_infoButtonsWindow.Resources 中定义的数据模板。

现在我得到一个错误,样式对象不能影响它所属对象的样式-属性。

我尝试了不同的方法,但都没有成功...我也尝试过先定义样式,然后再更改模板,但也没有用。

谢谢大家的帮助!

所以你不能在Style with Setter中设置Style 属性。为此,您需要使用 BasedOn:

<Style TargetType="ListBoxItem" BasedOn="{StaticResource DefaultListBoxItemStyle}">
    <Setter ... />
</Style>