WPF 将触发器应用于列表视图项以更改背景

WPF apply triggers to listview items to change background

我正在尝试创建一种用于在桌面应用程序内导航的左侧菜单。我的想法是使用 Buttons 作为 Listview 项目,它应该以这种方式运行:当我将鼠标悬停在它们上面时,背景应该改变颜色(变成 darkCyan),当我点击其中一个时,它的背景颜色应该持续改变(变成 darkCyan)直到我点击在列表的另一个按钮上。问题是我正在使用 DataTemplate 属性 来指定按钮的外观,并且我正在尝试应用触发器来更改 ListView 的 ControlTemplate 上的背景颜色。结果是有时背景颜色会改变,但与按钮相关的命令在其他时候不会触发。我认为我在树视图的错误元素中做这些事情,但我对树视图的了解不够,所以我不明白我做错了什么。这是 XAML 的代码,我在其中定义了按钮和 ListView

的样式
<Window.Resources>
    <DataTemplate DataType="{x:Type viewModels:TripViewModel}">
        <views:TripView />
    </DataTemplate>

    <Style TargetType="{x:Type Button}">
        <Setter Property="Height"
                Value="50" />
        <Setter Property="Background"
                Value="#555D6F" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border>
                        <Grid Background="Transparent">
                            <ContentPresenter HorizontalAlignment="Center"
                                              VerticalAlignment="Center" />
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style TargetType="{x:Type ListViewItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <Border BorderBrush="Transparent"
                            BorderThickness="0"
                            Background="{TemplateBinding Background}">
                        <ContentPresenter HorizontalAlignment="Center"
                                          VerticalAlignment="Center" />
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver"
                                 Value="True">
                            <Setter Property="Background"
                                    Value="DarkCyan" />
                        </Trigger>
                        <Trigger Property="IsSelected"
                                 Value="True">
                            <Setter Property="Background"
                                    Value="DarkCyan" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

这是我创建 ListView 的代码

<ListView Name="MenuButtons"
      ItemsSource="{Binding PageViewModels}"
      Background="Transparent"
      IsSynchronizedWithCurrentItem="True">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Button Content="{Binding Name}"
                    Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                    Margin="0" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

有人可以帮忙吗? 谢谢

我已经通过使用 ListBox 而不是 ListView 并按以下方式将 ItemContainer 设置为按钮解决了这个问题

<ListBox.ItemTemplate>
    <ItemContainerTemplate>
        <Button Content="{Binding Name}"
                Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                Margin="0" />
    </ItemContainerTemplate>
</ListBox.ItemTemplate>