如何将数组绑定到WPF数据网格中的列

如何将数组绑定到WPF数据网格中的列,wpf,arrays,binding,datagrid,Wpf,Arrays,Binding,Datagrid,我有一个包含曲线对象列表的日志对象。每条曲线都有一个名称属性和一个双精度数组。我希望名称位于列标题中,并在其下方显示数据。我有一个带有datagid的用户控件。这里是XAML <UserControl x:Class="WellLab.UI.LogViewer" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microso

我有一个包含曲线对象列表的日志对象。每条曲线都有一个名称属性和一个双精度数组。我希望名称位于列标题中,并在其下方显示数据。我有一个带有datagid的用户控件。这里是XAML

<UserControl x:Class="WellLab.UI.LogViewer"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="500" d:DesignWidth="500">
<Grid>
    <StackPanel Height="Auto" HorizontalAlignment="Stretch" Margin="0" Name="stackPanel1" VerticalAlignment="Stretch" Width="Auto">
        <ToolBarTray Height="26" Name="toolBarTray1" Width="Auto" />
        <ScrollViewer Height="Auto" Name="scrollViewer1" Width="Auto" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible" CanContentScroll="True" Background="#E6ABA4A4">
            <DataGrid AutoGenerateColumns="True" Height="Auto" Name="logDataGrid" Width="Auto" ItemsSource="{Binding}" HorizontalAlignment="Left">
            </DataGrid>
        </ScrollViewer>
    </StackPanel>
</Grid>

我甚至不会展示我试图用来绑定数组“数据”的代码,因为没有任何东西可以接近。我确信我遗漏了一些简单的东西,但在网上搜索了几个小时后,我不得不来寻求答案。

您需要将日志数据透视到
行数据项的集合中,其中每行包含一个双值集合,每个
曲线对应一个。同时可以提取列名。所以数据最终会是这样的

public class PivotedLogData : ViewModelBase
{
    public PivotedLogData(Log log)
    {
        ColumnNames = log.Curves.Select(c => c.Name).ToList();

        int numRows = log.Curves.Max(c => c.Values.Count);

        var items = new List<RowDataItem>(numRows);

        for (int i = 0; i < numRows; i++)
        {
            items.Add(new RowDataItem(
                          log.Curves.Select(
                              curve => curve.Values.Count > i
                                           ? curve.Values[i]
                                           : (double?) null).ToList()));
        }

        Items = items;
    }

    public IList<string> ColumnNames { get; private set; }
    public IEnumerable<RowDataItem> Items { get; private set; }
}

public class RowDataItem
{
    public RowDataItem(IList<double?> values)
    {
        Values = values;
    }

    public IList<double?> Values { get; private set; }
}
现在将数据绑定到网格

dataGrid.ItemsSource = pivoted.Items;

@dbaseman:的可能重复:这对数组没有帮助,因为没有内置逻辑来处理它们。@H.B.感谢您的澄清。我误解了这个问题。通常在将数组绑定到DataGrid时,数组的每个成员都是一行,而不是一列。在您的示例中,可以有两列,一列用于名称,另一列用于数据。如果数据本身是一个数组,那么您可以创建一个模板列,用某种ItemsControl绑定到每个数据数组。Moozhe认为数组的每个成员都是一行。这就是我一直想要的结果,对我来说是行不通的。我希望最终的解决方案有两个数据网格。一个用于标题,即与曲线关联的名称,另一个用于在scrollviewer中保存曲线数据的单独数据网格。曲线数据是一个双精度数组,通常包含数千个元素。感谢您提供的示例。它工作得很好。不幸的是,有两个问题。数据网格太慢了。打开一个有25000个条目的网格需要10秒钟。像这样的一个小数目几乎可以立即打开。此外,我还需要能够删除日志中的一条曲线,并看到网格中的一列消失。为了进一步解释,我正在尝试模拟一个现有的程序(Windows窗体),该程序使用与我现有的数据结构类似的数据结构。该程序可以很快打开更大的数据集。我认为它可能使用了第三方数据网格控件。我将不得不问作者他是如何做到的。我已经用250000条条目的10条曲线进行了测试。枢轴运动耗时500毫秒(可能会有所改进)。网格将立即显示。响应一个事件(CurveRemoved)然后删除一列和所有相关值应该很简单。我能够通过将数据网格放在DockPanel而不是StackPanel中(StackPanel也提供了滚动条)来显著加快数据网格的速度。我计算了4个案例的时间,包括数据透视和填充数据网格。以下是我的时代:开放日志MPR。所以一个较小的例子是2.5秒。也许我能找到另一种加速方式。所用时间:00:00:04.69点数:42500开放日志DTKRes建模所用时间:00:00:02.92点数:22500开放日志RADRAngleMM所用时间:00:00:02.51点数:22500开放日志RADRTargMM所用时间:00:00:02.32点数:22500I将在几分钟内开始工作,我可以了解他们是如何填写WinForm的控制
var pivoted = new PivotedLogData(log);

int columnIndex = 0;

foreach (var name in pivoted .ColumnName)
{
    dataGrid.Columns.Add(
        new DataGridTextColumn
            {
                Header = name,
                Binding = new Binding(string.Format("Values[{0}]", columnIndex++))
            });
}
dataGrid.ItemsSource = pivoted.Items;