wpf - 使用 ControlTemplate 时 ListView 忽略 DataTemplates

标签 wpf listview datatemplate

我尝试实现一个多列ListView。一切都工作得很好,直到我尝试设置 ListView 项的鼠标悬停和选择外观的样式。因此,我创建了一个 ControlTemplate(请参阅下面的 XAML)。当我使用 ControlTemplate 时,列的 DataTemplate 将被忽略。当我删除 ControlTemplate 时,一切都恢复正常。有人能指出我的错误吗?谢谢!

<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
    <Style.Resources>
        <SolidColorBrush Color="#FF355bbf" x:Key="ListItemSelectedFill" />
    </Style.Resources>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border CornerRadius="2" SnapsToDevicePixels="True"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        Background="{TemplateBinding Background}">
                    <Border x:Name="InnerBorder" CornerRadius="1" BorderThickness="1">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition MaxHeight="11" />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <Rectangle x:Name="UpperHighlight" Visibility="Collapsed" Fill="#75FFFFFF" />
                            <ContentPresenter Grid.Row="0"  Grid.RowSpan="2" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                        </Grid>
                    </Border>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="Transparent" />
                        <Setter Property="BorderBrush" Value="Transparent" />
                        <Setter TargetName="UpperHighlight" Property="Visibility" Value="Hidden" />
                    </Trigger>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="{StaticResource ListItemSelectedFill}" />
                        <Setter Property="BorderBrush" Value="{StaticResource ListItemSelectedFill}" />
                        <Setter TargetName="InnerBorder" Property="BorderBrush" Value="#80FFFFFF" />
                        <Setter TargetName="UpperHighlight" Property="Visibility" Value="Hidden" />
                        <Setter TargetName="UpperHighlight" Property="Fill" Value="{StaticResource ListItemSelectedFill}" />
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
</ListView.ItemContainerStyle>

<ListView.View>
<GridView>
    <!-- Column Checkbox -->
    <GridViewColumn Width="30" Header="">
        <GridViewColumn.CellTemplate>
            <DataTemplate>
                <CheckBox IsChecked="{Binding Path=IsSelected}" />
            </DataTemplate>
        </GridViewColumn.CellTemplate>
    </GridViewColumn>

    <!-- Column Details -->
    <GridViewColumn Width="300" Header="{Binding Path=DetailsHeaderText}" HeaderContainerStyle="{StaticResource HeaderStyle}" >
        <GridViewColumn.CellTemplate>
            <DataTemplate>
                <Grid x:Name="background" MouseDown="ContentGrid_OnMouseDown" Height="20">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>

                    <Border Grid.Column="0" Margin="{Binding Converter={StaticResource LevelMarginConverter}}" Background="Blue" BorderBrush="Transparent" BorderThickness="0" />

                    <ToggleButton Background="Transparent" Grid.Column="1" Style="{StaticResource ExpandCollapseToggleStyle}" x:Name="tbExpand" Visibility="Hidden" Click="ShowHide_OnMouseDown" 
                   HorizontalAlignment="Center" VerticalAlignment="Center"   IsChecked="{Binding IsExpanded, Mode=TwoWay}"/>

                    <TextBlock Grid.Column="2"  x:Name="txtTitle" Text="{Binding Path=Title}" />
                </Grid>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding HasChildren}" Value="True">
                        <Setter TargetName="tbExpand" Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding  RelativeSource={RelativeSource Mode=FindAncestor,  AncestorType={x:Type ListViewItem}}, Path=IsSelected}" Value="True">
                        <Setter TargetName="txtTitle" Property="Foreground" Value="White"/>
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </GridViewColumn.CellTemplate>
    </GridViewColumn>
</GridView>
</ListView.View>

最佳答案

将 ContentTemplate 中的 ContentPresenter 替换为 GridViewRowPresenter:

<ControlTemplate TargetType="{x:Type ListViewItem}">
    <Border ...>
        <Border ...>
            <Grid>
                ...
                <GridViewRowPresenter ... />
            </Grid>
        </Border>
    </Border>
</ControlTemplate>

关于wpf - 使用 ControlTemplate 时 ListView 忽略 DataTemplates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28539188/

相关文章:

JavaFX ListView - 删除单元格之间的间距/填充/边距

c# - 从 DataTemplate 设置的自定义 DependencyProperty

c# - 在列表框项之间绘制自定义元素

c# - 如何使用数据注释为 WPF 中的文本框创建输入验证?

java - 单击对话框按钮时从 ListView 中删除行

java - ListView onItemSelected 监听器不工作

c# - 来自字符串的 IValueConverter

c# - 如何从 MainWindow 调用异步方法?

c# - 用户控件在运行时动态创建,但存在内存泄漏

c# - WPF MVVM 和 TPL 数据流中的进度条