WPF - 如何使用不同的组样式创建ListView

时间:2010-10-18 15:06:28

标签: wpf listview

我有一组数据,我想以这种方式通过WPF ListView呈现:

Column1   Column2   Column3
--GroupName1--
Item1     part2     part3
Item2     part2     part3
--GroupName2--
Item3     part2     part3
Item4     long_text_in_both_columns
Item5     part2     part3
--GroupName1--
Item6     part2     part3
Item7     long_text_in_both_columns
--GroupName3--
Item8     part2     part3

我想为这些组着色,使每个组名都有一个相关的颜色。请注意,在上面的列表中,有两个“GroupName1”实例,两者都应该是相同的颜色。我开始使用这个基本样本:http://msdn.microsoft.com/en-us/library/ms771309(VS.90).aspx

具体地:
- 我如何拥有两个名称相同的组,但不同的项目? (可能是隐藏的“群组ID”与显示的“群组名称”不同?) - 我如何按名称为每个组设置样式?

(请注意,所有项目始终按顺序显示,除了组以外的选项也可以。)

3 个答案:

答案 0 :(得分:2)

以下是我最终解决这个问题的方法:

  1. 正如我最初想的那样,给每个项目GroupID和GroupName都很好。 ID仍然是唯一的,但这些组显示为:

        <ListView.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Margin" Value="1,1,1,10"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <Grid>
                                        <Rectangle Grid.ColumnSpan="4" Margin="0,0,0,0" Fill="{Binding Path=Items[0].GroupBackground}" Stroke="#FF808080" RadiusX="6" RadiusY="6" />
                                        <Expander IsExpanded="True">
                                            <Expander.Header>
                                                <DockPanel>
                                                    <TextBlock FontSize="14" Text="{Binding Path=Items[0].GroupName}" Margin="5,0,0,0" HorizontalAlignment="Stretch"/>
                                                </DockPanel>
                                            </Expander.Header>
                                            <Expander.Content>
                                                <ItemsPresenter />
                                            </Expander.Content>
                                        </Expander>
                                    </Grid>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </ListView.GroupStyle>
    
  2. 我发现我真正需要在小组上做的唯一造型是整体背景色。我在项目上创建了另一个属性以供组使用。我用以下方式访问它:

    Fill="{Binding Path=Items[0].GroupBackground}"
    
  3. 也许不是最好的方法(大量重复GroupName和GroupBackground数据),但它对我有用。

答案 1 :(得分:0)

你的问题很模糊,但我会尽力回答。

  1. 我如何拥有两个名称相同但不同的项目组? (可能类似于隐藏的“组ID”与显示的“组名”不同?)
  2. 您是如何确定每组中的项目首先属于那里的?在“组1”的示例中,如果您决定按定义的组描述对项目进行分组(您的示例使用“GroupName”),它们将始终位于同一组中

    1. 如何按名称设置每个组的样式?
    2. 可以通过以下方式定义分组样式。

      <Style TargetType="{x:Type GroupItem}" >
          <Setter Property="Template" >
              <Setter.Value>
                  <ControlTemplate TargetType="{x:Type GroupItem}" >
                      <GroupBox Header="{Binding Name}" />
                          // define style here...
                      </GroupBox >
                  </ControlTemplate>
              </Setter.Value>
          </Setter>
      </Style>
      
      // ...
      <ListView.GroupStyle>
          <GroupStyle />
      </ListView.GroupStyle>
      // ...
      

答案 2 :(得分:0)

在collectionviewgroup的Name属性上使用DataTrigger,它是groupitem的datacontext