Многоуровневый заголовок GridView WPF - PullRequest
8 голосов
/ 28 января 2011

Мне нужно установить представление списка в виде сетки, которая имеет такой сложный заголовок (на основе созданного мною трехмерного списка объектов):

| ---------- 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 ]

1 голос
/ 31 января 2011

Примерно так:

<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;
0 голосов
/ 03 февраля 2011

Задумывались ли вы о том, как это должно вести себя - ваш заголовок, который есть?

Достаточно просто сделать заголовок, похожий на тот, который вы предлагаете - вы можете создать его с некоторыми сетками программно - но это только заголовок. Вы также сможете изменить его размер, как обычно, с заголовком списка?

Может быть, вы ищете что-то вроде TreeListView?

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

Я думаю, что это то, что я бы хотел использовать для отображения многомерных данных - его легко понять и использовать, когда пользовательский просмотр списка может быть трудно реализовать для правильного поведения.

0 голосов
/ 28 января 2011

Уровень 0 Является ли ListView? Уровень 1A и уровень 1b - это Gridview, которые вы хотите внутри двух разных шаблонных столбцов внутри уровня 0. Тогда уровень A и уровень b - это еще два вида сетки внутри еще 2 шаблонных столбцов на уровне 1a и уровне 1b?

Возможно, вы сможете преобразовать ту же концепцию, которую использует вложенный GridView, в WPF

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

Я сам не пробовал в wpf, но gridviews, похоже, были построены аналогично. Просто используйте панели вместо Div, и вам не нужно беспокоиться о вызовах клиент / сервер.

Также наборы данных работают лучше, чем списки.

Вот некоторый псевдо-код о том, как я настроил Nested Datasets до

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;
...