将两个 List<String> 绑定到 DataGrid

Binding two List<String> to DataGrid

我有两个列表,打算在一个 DataGrid 中显示。

此代码生成 InvalidOperationException:

这是我的属性部分:

public List<String> Temperature;
public List<String> Time;

以及列表如何填充数据

Temperature = new List<string>(reader.GetTemperature());
Time = new List<string>(reader.GetTime());

我如何在 C# 中绑定到 DataGrid

dtgCsvData.ItemsSource = Temperature;
dtgCsvData.ItemsSource = Time;

XAML:

<DataGrid x:Name="dtgCsvData" HorizontalAlignment="Left" Margin="10,187,0,0" VerticalAlignment="Top" Height="200" Width="250" AutoGenerateColumns="False">
     <DataGridTextColumn Binding="{Binding Temperature}" Header="Temperature" IsReadOnly="True"/>
     <DataGridTextColumn Binding="{Binding Time}" Header="Time" IsReadOnly="True" />
</DataGrid>

有人可以帮我吗?

如果你想成对显示时间和温度(在两列中),试试这个:

dtgCsvData.ItemsSource = Time.Zip(Temperature, (t,c) => 
    new {Time = t, Temperature = c});

使用 Zip,您将两个序列配对并使用该对创建一个新的匿名类型对象。然后 DataGrid 应该能够使用您在 xaml 中定义的绑定将每一对显示为一行。


您没有将列定义包装在 <DataGrid.Columns>...</DataGrid.Columns> 中,因此您提供的列被错误地添加到 DataGrid.Items 中。由于您不能同时设置 DataGrid.ItemsDataGrid.ItemsSource,因此您会得到 InvalidOperationException。要修复它:

<DataGrid x:Name="dtgCsvData" HorizontalAlignment="Left" Margin="10,187,0,0" VerticalAlignment="Top" Height="200" Width="250" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Temperature}" Header="Temperature" IsReadOnly="True"/>
        <DataGridTextColumn Binding="{Binding Time}" Header="Time" IsReadOnly="True" />
    </DataGrid.Columns>
</DataGrid>

我认为您正在尝试实现类似以下代码的功能。请检查这个。

<DataGrid x:Name="dtgCsvData" HorizontalAlignment="Left" VerticalAlignment="Top" Height="200" Width="250" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Temperature}" Header="Temperature" IsReadOnly="True"/>
            <DataGridTextColumn Binding="{Binding Time}" Header="Time" IsReadOnly="True" />
        </DataGrid.Columns>            
    </DataGrid>
public partial class MainWindow : Window
{        
    public MainWindow()
    {
        InitializeComponent();
        List<MyClass> lst = new List<MyClass>();
        lst.Add(new MyClass() { Temperature = "60 F", Time = "2:30 PM" });
        lst.Add(new MyClass() { Temperature = "62 F", Time = "2:35 PM" });
        dtgCsvData.ItemsSource = lst;
    }        
}

class MyClass
{
    public string Temperature { get; set; }
    public string Time { get; set; }
}