【问题标题】:Best Way To Span Multiple Columns in WPF Grid/List?在 WPF 网格/列表中跨越多列的最佳方法?
【发布时间】:2010-09-24 19:01:55
【问题描述】:

我在 WPF 中编写了一个自定义用户控件来显示一些数据。我想在列表中显示这个用户控件,但我还想提供多个列标题(匹配用户控件上的某些属性),以便用户可以对用户控件中包含的属性进行排序。

我不确定解决此问题的最佳方法。

我目前有一个显示这些用户控件的 ListBox,但 ListBox 没有标题,我不知道如何在 ListBox 上放置多个标题。

理想情况下,我想要这样的东西:

Header1   Header2  Header3   Header4
[UserControlThatSpansAllFourColumns]

我的另一个想法是使用 DataGrid 并以某种方式让每个项目跨越多个列,但到目前为止我也无法弄清楚。

如果有人有任何建议,我会欢迎他们!

【问题讨论】:

    标签: wpf datagrid listbox grid columnspan


    【解决方案1】:

    好的,这在任何情况下都不是“最好的方法”,但我只是把它扔进去。一种像你需要的那样工作的方法是使用 ListView 和使用 <ContentPresenter> 的自定义 ItemContainerStyle而不是默认的<GridViewRowPresenter>。这个简短的 XAML 在某种程度上证明了这一点:

    <ListView>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListViewItem">
                            <ContentPresenter/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Header1"/>
                <GridViewColumn Header="Header2"/>
            </GridView>
        </ListView.View>
    
        <Button>Item1</Button>
        <Button>Item2</Button>
    
    </ListView>
    

    在这里,您可以获得列标题,并且项目跨越整个列表视图。然而,在这个解决方案中,项目的渲染有点像在自己的世界中。它并没有真正连接到为 ListView 定义的列。因此,我想使这项工作更好的一种方法是提供您自己的 &lt;RowPresenter&gt; 实现,该实现实际上考虑了父列表视图中定义的 GridViewColumns。

    无论如何,希望这会有所帮助。

    【讨论】:

    • 非常感谢!这基本上就是我想要的。我用自定义的 UserControl 替换了 ContentPresenter 并且它起作用了。一点排序魔法,我就会有一个完整的解决方案。
    • 这很有帮助,谢谢,请告诉我如何保持几列不变并仅合并特定列?
    猜你喜欢
    • 2019-10-27
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 2017-10-18
    • 2018-04-29
    • 1970-01-01
    相关资源
    最近更新 更多