这是班级:
public class TrainingData
{
public string Training { get; set; }
}
这是MainWindow中的其余代码:
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open("D:/excel.xlsx");
Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1];
Excel.Range xlRange = xlWorksheet.UsedRange;
List <TrainingData> tData= new List <TrainingData>();
int rowCount = xlRange.Rows.Count;
int colCount = xlRange.Columns.Count;
//int k = 0;
for (int i = 1; i <= rowCount; i++)
{
tData.Add(new TrainingData() { Training = xlRange.Cells[i, 1].Value2.ToString() });
//MessageBox.Show(tData[k].Training);
//k++;
}
Prikaz.ItemsSource = tData;
数据网格:
<DataGrid AutoGenerateColumns="False" Height="120" HorizontalAlignment="Left" Margin="12,12,0,0" Name="Prikaz" VerticalAlignment="Top" Width="105" ItemsSource="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Header="Header" />
</DataGrid.Columns>
</DataGrid>`
所以,Prikaz是我的DataGrid。 tData是TrainingData对象的列表。如果我取消注释这三行,我可以测试我是否正确地从excel文件中导入信息,是的,这样可以正常工作。
那为什么我得到空的DataGrid?它有正确的行数和只有一列,没关系,但它没有数据。我使用这一行:Prikaz.ItemsSource = tData;
来绑定我的对象列表和DataGrid。培训是公开的,因此应该存在于DataGrid中。可能导致问题的原因是什么?
答案 0 :(得分:1)
您需要将列路径绑定到属性Training。
语法是这样的,但这只是来自内存。 文本需要绑定到训练路径
<DataTemplate>
<TextBlock Text="{Binding Path=Training}"/>
</DataTemplate>
或
<DataGridTextColumn Header="Header" Binding="{Binding Path=Training}/>
答案 1 :(得分:1)
虽然您已在代码中指定了ItemsSource
属性,但您还需要提供绑定到DataGrid
中与您的属性相连的ItemsSource对象的列,如下所示:
<DataGrid.Columns>
<DataGridTextColumn Header="Header" Binding="{Binding Path=Training}"/>
</DataGrid.Columns>
您还需要为INotifyPropertyChanged
类实现TrainingData
接口,而不是使用集合List<TrainingData>
最好使用ObservableCollection<TrainingData>
集合对象。这个MSDN article提供了DataBinding
概述以及您希望在自定义类中使用上述接口的原因。