多级标题GridView WPF

时间:2011-01-28 11:02:23

标签: c# wpf binding wpfdatagrid

我需要将listview视图设置为gridview,它具有这样的复杂标题(基于我创建的3维对象列表):

| ---------- 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 ...)和每个阈值显示值1到4如果他们是!= 0

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

0级是ListView吗?级别1A和级别1b是您想要在级别0列表视图内的两个不同模板化列中的网格视图?那么A级和B级是在1a级和1b级中2个更模板化的列中的另外两个网格视图?

您可以将此嵌套GridView使用的相同概念转换为WPF

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

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

数据集也比列表更好。

以下是关于我如何在

之前设置嵌套数据集的一些伪代码
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;

答案 2 :(得分:0)

你有没有想过它应该如何表现 - 你的标题是什么?

很容易制作一个看起来像你建议的标题 - 你可以用编程方式构建一些网格 - 但这只是标题。您是否也可以像往常一样使用listview标题调整大小?

也许您正在寻找类似TreeListView的东西?

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

我认为这就是我要展示多维数据的方法 - 它易于理解和使用,自定义列表视图很难实现以便正确行事。