多级标题 GridView WPF

8
我需要将列表视图设置为一个带有复杂头部的网格视图,类似于这样(基于我创建的三维对象列表):
| ---------- LEVEL 0 ------------  |
| -- Level 1a --  | -- Level 1b -- |  
| Lvl A |  Lvl B  | Lvl A  | Lvl B |

编辑:这大致上是我的对象模型

public class Measures
{
    public string Caption { get; set; }
    public List<Threshold> ThresholdList { get; set; }
}

public class Threshold
{
    public string Caption { get; set; }

    public double Value1 { get; set; }
    public double Value2 { get; set; }
    public double Value3 { get; set; }
    public double Value4 { get; set; }
}

我需要绑定一个动态列表的Measures (这是我的0级),然后是一个动态列表的Threshold(1a级别...),并且对于每个阈值,如果它们不等于0,则显示值1到4。


堆叠多个GridViewRowHeaderPresenter怎么样?这可能是一个好的方法吗?我卡在这个问题上了... - michele
我们能否更清楚地了解您的对象模型/数据是什么样子? - RQDQ
@RQDQ 我已经添加了需要显示的对象模型。 - michele
3个回答

1

这样怎么样:

<ListBox x:Name="MainListBox">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>

                        <Label Content="{Binding Path=Caption}" HorizontalAlignment="Center" />

                        <ListBox Grid.Row="1" ItemsSource="{Binding Path=ThresholdList}" >
                            <ListBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
                                    </StackPanel>
                                </ItemsPanelTemplate>
                            </ListBox.ItemsPanel>

                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <Grid>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto" />
                                            <RowDefinition Height="Auto" />
                                        </Grid.RowDefinitions>

                                        <Label Content="{Binding Path=Caption}" HorizontalAlignment="Center" />

                                        <StackPanel Grid.Row="1" Orientation="Horizontal">
                                            <Label Content="{Binding Path=Value1}" />
                                            <Label Content="{Binding Path=Value2}" />
                                            <Label Content="{Binding Path=Value3}" />
                                            <Label Content="{Binding Path=Value4}" />
                                        </StackPanel>
                                    </Grid>
                                </DataTemplate>
                            </ListBox.ItemTemplate>


                        </ListBox>

                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

你可能需要将Value1、Value2属性转换为集合,以便动态显示非零值,并使用我用于显示阈值的相同ListBox/StackPanel方法。

这将产生以下输出:

Screenshot

最后,为了完成这篇文章,这是我使用的代码:

List<Measures> measuresList = new List<Measures>();

Measures measures = new Measures()
{
    Caption = "LEVEL 0",
    ThresholdList = new List<Threshold>()
};

measures.ThresholdList.Add(new Threshold()
{
    Caption = "Level 1a",
    Value1 = 1,
    Value2 = 2,
    Value3 = 3,
    Value4 = 4
});

measures.ThresholdList.Add(new Threshold()
{
    Caption = "Level 1b",
    Value1 = 5,
    Value2 = 6,
    Value3 = 7,
    Value4 = 8
});

measuresList.Add(measures);

this.MainListBox.ItemsSource = measuresList;

谢谢,看起来是个不错的提示,我会尽快试一下!我的唯一疑问是我需要使用列表视图,因为我写的对象模型迄今为止重复了n行(代表n个成员)。现在我正在使用更简单的解决方案(因为项目的期限不等人),但我仍在寻找更优雅的解决方案! - michele
@michele - 这种方法仍然适用于多个度量对象和多个阈值对象。这是你想要解决的问题吗? - RQDQ
我尝试了你的代码示例。它可以工作,但是我需要将树形结构设置在listview的标题上,而listview中的行只显示底层值。你的示例在每一行内设置了树形结构,而我正在尝试避免这种情况。我认为唯一的解决方案是编写一个完全自定义的控件。再次感谢。 - michele
@michele - 你没有很好地解释你需要什么。我给了你一个看起来非常像你在问题中指出的样本。我还指出它将适用于多个Measures、ThresholdList对象。也许你提供的数据对象不是你想要显示的? - RQDQ
我的原始问题是如何获取一个带有多级标题的列表视图。我提供的对象模型是关于我必须绑定到标题的结构。相同的对象模型包含在其他n个对象中,我必须在列表视图项中显示它们。如果我没有表达清楚,我很抱歉,也许我需要再多思考一下数据结构的疑惑。再次感谢。 - michele

0

Level 0 是一个 ListView?Level 1A 和 Level 1B 是两个 Gridview,你想把它们放在 Level 0 List view 的两个不同的模板列中?然后 Level A 和 Level B 又是两个 Gridview,分别放在 Level 1A 和 Level 1B 的另外两个模板列中?

你可能可以将这个嵌套 GridView 的概念转换为 WPF。

http://forums.asp.net/t/1071521.aspx

我在wpf中没有尝试过,但是gridviews似乎是类似构建的。 只需使用面板而不是Divs,并且不必担心客户端/服务器端调用的问题。

此外,数据集比列表更好用。

以下是我以前设置嵌套数据集的一些伪代码

DataSet ds1 = new DataSet();
        ds1.Tables.Add(m_DataLayer.GetRealA_Data(X, Y).Copy()); Returns Table ["A"]
        ds1.Tables.Add(m_DataLayer.GetB_Empty().Copy());// Returns Table ["B"]
        ds1.Tables.Add(m_DataLayer.GetC_Empty().Copy());// Returns Table ["C"]
        ds1.Tables.Add(m_DataLayer.GetD_Empty().Copy());// Returns Table ["D"]

        ds1.Relations.Add("b", ds1.Tables["A"].Columns["A_id"], ds1.Tables["B"].Columns["A_id"]);
        ds1.Relations.Add("c", ds1.Tables["B"].Columns["B_id"]
            , ds1.Tables["C"].Columns["B_id"]);
        ds1.Relations.Add("d", ds1.Tables["C"].Columns["C_id"]
            , ds1.Tables["D"].Columns["D_id"]);

        dt_TheGridViewDataSet = ds1;
        TheGridView.DataSource = ds1;

非常感谢您的提示。不幸的是,使用嵌套网格视图似乎并不是解决我的问题的方法。我需要只有一个列表视图,显示最低级别(lvl A,lvlB):上层仅为描述性质,我需要它们知道指的是哪个对象的lvlA等。 - michele

0
你有没有想过你的标题应该如何表现呢?
制作一个看起来像你建议的标题很容易,你可以通过一些网格程序来构建它,但那只是标题而已。你是否也应该能够像通常使用列表视图标题时那样调整它的大小呢?
也许你正在寻找类似于TreeListView的东西?

http://www.codeproject.com/KB/WPF/TreeListView.aspx

我认为这是显示多维数据的最佳选择 - 它易于理解和使用,而自定义列表视图可能难以实现正确的行为。


谢谢你的提示。当我有空的时候,我想尝试一下那个控件! - michele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接