wpf - 如何将数组绑定(bind)到 WPF 数据网格中的列

标签 wpf arrays binding datagrid

我有一个包含 Curve 对象列表的 Log 对象。每条曲线都有一个 Name 属性和一个 double 组。我希望名称位于列标题及其下方的数据中。我有一个带有 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>

在后面的代码中,我已经想出了如何创建列并为它们命名,但我还没有想出如何绑定(bind)数据。

public partial class LogViewer
{
    public LogViewer(Log log)
    {
        InitializeComponent();

        foreach (var curve in log.Curves)
        {
            var data = curve.GetData();
            var col = new DataGridTextColumn { Header = curve.Name };
            logDataGrid.Columns.Add(col);
        }
    }
}

我什至不会展示我试图用来绑定(bind)数组“数据”的代码,因为没有什么比这更接近了。我确信我遗漏了一些简单的东西,但在网上搜索了几个小时之后,我不得不来乞求答案。

最佳答案

您需要将日志数据转换为 RowDataItem 的集合,其中每一行都包含一组 double 值,每个 Curve 一个。同时您可以提取列名。所以数据最终会变成这样。

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

然后您将创建 DataGridTextColumn 项目,但具有合适的绑定(bind)

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++))
            });
}

现在将数据绑定(bind)到网格

dataGrid.ItemsSource = pivoted.Items;

关于wpf - 如何将数组绑定(bind)到 WPF 数据网格中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10866459/

相关文章:

wpf - Mvvm - 如何使用 dataBinding 命令和参数命令在 ViewModel 中捕获按下了哪个按钮?我没有得到什么?

java - 将整数插入排序数组

ios - Swift 1.2 中未正确实现随机播放功能

javascript - 按月份和年份对数组进行排序

c# - 绑定(bind)在 Mvvm wpf 和 controltab 中不起作用

WPF ComboBox 绑定(bind)到非字符串对象

.net - C# 浏览器组件添加 header 参数

c# - WPF keyDown 响应时间准确性

Python 绑定(bind)到 ImageMagick

c# - WP8.1 DatePicker 绑定(bind) - 值永远不会更新