将两个 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.Items
和 DataGrid.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; }
}
我有两个列表,打算在一个 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.Items
和 DataGrid.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; }
}