继续this问题。
我想实现这种ListView
:
应该有两件事:
ItemsSource
绑定的不同数据类型以不同方式显示。要解决(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
,我觉得所有这些都是相关的(删除任何东西可能会以简化的方式解决这个问题,不适合完整的解决方案)。