wpf listview / gridview:隐藏重复的内容

时间:2009-03-18 22:15:29

标签: wpf listview

我是WPF的新手,不知道如何实现我需要的东西。

我的问题:

我有一个数据绑定的WPF gridview显示SQL查询的结果。 一些列提供了我想隐藏的重复数据。 这样:

occupancy   name       room
---------   ---------  -----
Occupied    Bob        1
Occupied    Ted        2
Available              3
Available              4

应该是这样的:

occupancy   name       room
---------   ---------  -----
Occupied    Bob        1
            Ted        2
Available              3
                       4

我的环境:

在.net 3.5上使用C#。我已将listview绑定到dataview集合。我有一个数据模板,用于控制格式的单元格。

我的暂时解决方案:

我认为我应该对模板应用触发器并更改属性,以便在数据与前一行相同的第一行之后的所有行上使文本为空。

当我设置触发器时,我可以在xaml中执行所有操作,还是需要编写代码来访问上一行?

如果它在XAML中,你如何构造绑定字符串以引用它绑定到的数据视图的当前行和前一行中的列?它会在第一行阻塞,因为没有前一行吗?

这是我正在使用的模板:

<DataTemplate x:Key="Occupancy">
    <TextBlock Name="Occupancy" Text="{Binding Path=Occupancy}" TextAlignment="Left" />
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=Occupancy}">
            <DataTrigger.Value>Available</DataTrigger.Value>
            <Setter TargetName="Occupancy" Property="**{previous column's content}**" Value="**{current columns content}**"/>
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

也许使用RelativeSource:PreviousData ??

如果我必须编写代码,是否有人知道一个可以让我入门的体面教程?

替代解决方案是可以的,但我认为我可以应用于许多列的无代码风格将是最佳解决方案。

感谢您的时间。

3 个答案:

答案 0 :(得分:2)

我对RelativeSource:PreviousData有过负面体验。它在ListBox中工作,但在列表视图中我收到了一个错误 “无法找到用作RelativeSource的前一个元素,因为生成的上下文中没有父元素。”

我自己最终放弃并枚举行(想法是用它来打印行号)。

在您的情况下,我将使用ModelView,其列表元素将指向模型的相应元素和前一元素。因此,如果previous和current在相应的属性中具有相同的值,则ModelView的元素将返回null。

答案 1 :(得分:1)

我对WPF ListView没有太多经验(我倾向于坚持使用更基本的控件/容器),但您是否考虑过首先使用LINQ查询对原始数据进行分组?

答案 2 :(得分:1)

以前的数据选项仅适用于ListView,并且仅当您没有与之关联的GridView时。我相信这可能是因为连接到ListView控件的视图不会创建ItemsControl集合。找到以前数据的代码检查ItemsControl集合中的上一个项目。这只是猜测。