ListView多行列标题,在ItemSource中包含不同类型的数据

时间:2015-01-30 14:40:36

标签: c# wpf listview

继续this问题。

我想实现这种ListView

应该有两件事:

  1. 多行列标题;
  2. 通过ItemsSource绑定的不同数据类型以不同方式显示。

  3. 要解决(1)我尝试使用HeaderTemplate

    <ListView>
        <ListView.View>
            <GridView>
                <GridViewColumn Header="A" DisplayMemberBinding="{Binding A}">
                    <GridViewColumn.HeaderTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding}"/>
                        </DataTemplate>
                    </GridViewColumn.HeaderTemplate>
                </GridViewColumn>
    ...
    

    DataTemplate可能更复杂:

    <DataTemplate>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <TextBlock Text="{Binding}" HorizontalAlignment="Center"/>
            <GridViewHeaderRowPresenter Grid.Row="1" Columns="{StaticResource ResourceKey=aaa}"/>
        </Grid>
    </DataTemplate>
    

    其中aaa是某些GridViewColumnCollection的关键字:

    <GridViewColumnCollection x:Key="aaa">
        <GridViewColumn Header="B" DisplayMemberBinding="{Binding B}"/>
        <GridViewColumn Header="C" DisplayMemberBinding="{Binding C}"/>
     </GridViewColumnCollection>
    
    然而,这会产生不良结果:

    鼠标悬停看起来很难看,重新调整大小B只会更改C,但不会更改A

    问题:如何正确制作多行列标题?


    要解决(2)我尝试根据项目属性Mode的值切换模板(当它是2 - 使用时:

    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Mode}" Value="2">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListViewItem">
                                <StackPanel x:Name="PART_Panel" Orientation="Horizontal">
                                    <TextBlock Text="{Binding D}"/>
                                    <TextBlock Text="{Binding E}" Margin="5,0"/>
                                </StackPanel>
    ...
    

    它有效,我可以使用ObservableCollection<object>来绑定两种类型的对象(一种具有A,B,C属性,另一种具有D,E,两种类型也具有Mode属性),但是......

    Mode = 2项目存在视觉问题。 ListView外观(称为 Vista )不会被继承,只有Mode != 2项具有它。我正在谈论鼠标悬停突出显示和选择项目,当使用Mode = 2选项时,选项如下所示:

    A-AA被鼠标覆盖(但没有突出显示)并且B-BB具有键盘焦点(使用箭头键选择,如果我尝试用鼠标点击它,它也没有)。

    当然,我可以添加触发器,但要做什么?改变背景颜色?它看起来根本不是 Vista !在这里,我尝试使用默认的ListViewItem模板颜色:

    <ControlTemplate.Triggers>
        <Trigger Property="Selector.IsSelected" Value="True">
            <Setter Property="Background" TargetName="PART_Panel">
                <Setter.Value>
                    <DynamicResource ResourceKey="{x:Static SystemColors.HighlightBrushKey}" />
                </Setter.Value>
            </Setter>
    ...
    

    但结果却令人失望:

    注意差异:{{1>}被选中( Vista 样式)和丑陋2-22-222

    问题:如何正确显示绑定为A-AA的不同数据类型?如何保持良好的 Vista 风格?

    P.S。:我为一点(或多)长的问题道歉。我可以将它分成几个,但我的意图是实现完整的ItemSource,我觉得所有这些都是相关的(删除任何东西可能会以简化的方式解决这个问题,不适合完整的解决方案)。

0 个答案:

没有答案