Макет ListBox с какой-то сеткой - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть эти данные из XML:

var searched = from c in xml.Descendants("tbody").Descendants("tr")
         let team = c.Element("td").ElementsAfterSelf("td")
         select new Time
            {
                a = c.Element("td").ElementsAfterSelf("td").First().Value,
                b = Int32.Parse(c.Descendants("td").ElementAt(3).Value),
                c = Int32.Parse(c.Descendants("td").ElementAt(4).Value),
                d = Int32.Parse(c.Descendants("td").ElementAt(5).Value),
                e = Int32.Parse(c.Descendants("td").ElementAt(6).Value),
                f = Int32.Parse(c.Descendants("td").ElementAt(7).Value),
                g = Int32.Parse(c.Descendants("td").ElementAt(8).Value),
                h = Int32.Parse(c.Descendants("td").ElementAt(9).Value),
                i = Int32.Parse(c.Descendants("td").ElementAt(10).Value),
                j = float.Parse(c.Descendants("td").ElementAt(11).Value)
            };

Готово, я отображаю их в виде ListBox:

foreach (var item in searched)
    {
         listBox1.Items.Add(item.a + "  " + item.b + "  " + item.c + "  " + 
           item.d + "  " + item.e + "  " + item.f  + "  " + item.g + "  " + 
           item.h + "  " + item.i + "  " + item.j);
         listBox1.Items.Add("  ");
    }

Печатается нормально, вот какЯ этого хотел.Теперь мне нужно отформатировать его.Теперь он печатает так:

a     b    c    d  e  f  g  h  j

Тем не менее, содержимое переменной отличается по размеру.Так что информация не очень организована.Поэтому я хотел что-то вроде:а | B | C | D | E | F | G | H | Jа | B | C | D | E | F | G | H | JВ котором |представляет столбец.Я думал о сетке внутри списка, но потом заблудился, как это сделать.

1 Ответ

1 голос
/ 23 ноября 2011

Ну, а как насчет ListBox с ItemTemplate с учетом ваших данных?

Это ListBox:

<ListBox HorizontalAlignment="Left" Margin="12,6,0,0" Name="listBox1" VerticalAlignment="Top">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="150" />
                    <ColumnDefinition Width="150" />
                    <ColumnDefinition Width="150" />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding a}" Margin="0,0,12,0" />
                <TextBlock Grid.Column="1" Text="{Binding b}" Margin="0,0,12,0" />
                <TextBlock Grid.Column="2" Text="{Binding c}" Margin="0,0,12,0" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Он использует сетку для каждого элемента, помещая значения в отдельные столбцы. Вы можете поэкспериментировать с размерами столбцов.

Это демонстрирует привязку:

private void button1_Click(object sender, RoutedEventArgs e)
{
    List<MyObject> list = new List<MyObject>();
    list.Add(new MyObject() { a = 1, b = 2, c = 3 });
    list.Add(new MyObject() { a = 4, b = 57346, c = 6 });
    list.Add(new MyObject() { a = 7, b = 8, c = 9 });

    listBox1.ItemsSource = list;
}

Я просто создаю список с подготовленными данными и устанавливаю его как ItemsSource из списка. В вашем случае данные будут поступать из XML.

И я использовал этот фиктивный класс для тестирования:

public class MyObject
{
    public int a { get; set; }
    public int b { get; set; }
    public int c { get; set; }
}

В нем только 3 поля для демонстрации того, как это работает. Вы можете легко добавить и другие поля. Для каждого дополнительного поля добавьте еще один ColumnDefinition и TextBlock в XAML и установите Binding соответственно.

...