【问题标题】:How to fill Nested Data with DataGrid in WPF如何在 WPF 中使用 DataGrid 填充嵌套数据
【发布时间】:2018-11-15 09:30:08
【问题描述】:

我想在 wpf 中的 dataGrid 列中填充嵌套数据,并且我已经将主类模型与 datagrid itemsource 附加在一起,所以我不知道如何使用和填充其中的详细信息。

型号:

public class SESSION
{
    public string open { get; set; }
    public string high { get; set; }
    public string low { get; set; }
    public string last { get; set; }
}

public class QUOTE
{
    public string symbol { get; set; }
    public string name { get; set; }
    public List<SESSION> SESSION { get; set; }
}

public class RootObject
{
    public List<QUOTE> QUOTE { get; set; }
}

我的数据网格在 xaml 文件中是:

 <DataGrid Name="grdData">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding name}" />
            <DataGridTextColumn Header="Symbol" Binding="{Binding symbol}"/>
            <DataGridTextColumn Header="High" Binding="{Binding high}" />
            <DataGridTextColumn Header="Low" Binding="{Binding low}" />
        </DataGrid.Columns>
 </DataGrid>

我也在使用 grdData.ItemsSource = rootObject.QUOTE.ToList();在gridview中填充数据。 那么如何从 DataGrid 中的 session 中获取 open、high、low 和 last 值?

请帮忙解决这个问题。

【问题讨论】:

  • SESSION 是一个列表 - 您希望如何布置网格?您可以使用 &lt;DataGridTemplateColumn&gt; 并使用 DataTemplate 来显示 SESSION 项。或者,如果 SESSION 仅包含一个项目,则绑定到集合中的第一条记录,例如&lt;DataGridTextColumn Header="High" Binding="{Binding Path=SESSION[0].high}" /&gt;
  • 嗨,西蒙。我已经申请了SESSION[0].high,但它没有返回任何东西。
  • 它肯定包含一个值吗?我创建了一个测试项目,并且对我的测试数据很有效。我将作为答案发布,以便您查看代码...

标签: c# wpf data-binding wpfdatagrid desktop-application


【解决方案1】:

由于 SESSION 属性是一个列表,您要么需要使用另一个集合控件,例如ItemsControl,在 DataGridTemplateColumn 中,或绑定到列表中的特定项。与后者一起,从 cmets,我有一个测试窗口如下:

XAML:

<Window x:Class="TestWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:CoSecApp_v3"
    mc:Ignorable="d"
    Title="TestWindow" Height="450" Width="800">
<Grid>
    <DataGrid Name="grdData" AutoGenerateColumns="False" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding name}" />
            <DataGridTextColumn Header="Symbol" Binding="{Binding symbol}"/>
            <DataGridTextColumn Header="High" Binding="{Binding Path=SESSION[0].high}" />
            <DataGridTextColumn Header="Low" Binding="{Binding Path=SESSION[0].low}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>
</Window>

代码背后:

public class TestWindow
{
private void TestWindow_Loaded(object sender, RoutedEventArgs e)
{
    RootObject DC = new RootObject();
    DC.QUOTE = new List<QUOTE>();
    for (int I = 1; I <= 10; I++)
    {
        DC.QUOTE.Add(new QUOTE() { name = "Name" + I, symbol = I, SESSION = new List<SESSION>() });
        DC.QUOTE[I - 1].SESSION.Add(new SESSION() { open = "open", high = "100", low = "10", last = "final" });
    }
    grdData.ItemsSource = DC.QUOTE.ToList();
}

public class SESSION
{
    public string open { get; set; }
    public string high { get; set; }
    public string low { get; set; }
    public string last { get; set; }
}

public class QUOTE
{
    public string symbol { get; set; }
    public string name { get; set; }
    public List<SESSION> SESSION { get; set; }
}

public class RootObject
{
    public List<QUOTE> QUOTE { get; set; }
}
}

这会按预期使用测试数据填充我的网格。

(顺便说一句,DC.QUOTE.ToList() 上不需要 .ToList,因为它已经是一个 List 对象。)

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2021-12-07
    相关资源
    最近更新 更多