今天在用DataGrid时遇到了不显示数据的问题,在网上找了好多也没找到我的答案,折腾了好久才解决,因此记录一下。由于文笔不佳,且比较怕麻烦,所以今天第一次写博文😓。
由于我用的是MVVM模式,因此用的ObservableCollection<T>集合类作为DataGrid的数据源,具体见如下代码:
1、定义一个类存储行信息
public class TestInfo
{
public string ID { get; set; }
public string IdOperator { get; set; }
public string TestTime { get; set; }
public string InnerBoxCode { get; set; }
public int Number { get; set; }
}
2、再定义一个类用来存储显示信息
public class ShowTestInfo
{
public TestInfo TestInfo { get; set; }
}
3、创建ObservableCollection<T>集合类属性
private ObservableCollection<ShowTestInfo> testInfoList;
public ObservableCollection<ShowTestInfo> TestInfoList
{
get { return testInfoList; }
set { testInfoList = value; }
}
4、将TestInfoList作为DataGrid的数据源,当给TestInfoList中添加数据时即可显示
<DataGrid CanUserDeleteRows="False" CanUserAddRows="False" FontSize="16" ItemsSource="{Binding TestInfoList}" AutoGenerateColumns="False"
Margin="0,5,0,5" IsReadOnly="True" SelectionMode="Single" BorderBrush="SkyBlue" BorderThickness="3" >
<DataGrid.Columns>
<DataGridTextColumn Header="产品码" Binding="{Binding TestInfo.ID}" IsReadOnly="True"/>
<DataGridTextColumn Header="操作员ID" Binding="{Binding TestInfo.IdOperator}" IsReadOnly="True"/>
<DataGridTextColumn Header="内箱码" Binding="{Binding TestInfo.InnerBoxCode}" IsReadOnly="True"/>
<DataGridTextColumn Header="每包数量" Binding="{Binding TestInfo.Number}" IsReadOnly="True"/>
<DataGridTextColumn Header="打包时间" Binding="{Binding TestInfo.TestTime}" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
以上操作显示没有问题,但是我今天在界面上还需要显示另外一个类似的表格,我定义了另外一个表格及其类如下
public class Test2Info
{
public string ID { get; set; }
public string IdOperator { get; set; }
public string TestTime { get; set; }
public string InnerBoxCode1 { get; set; }
public string InnerBoxCode2 { get; set; }
public int Number { get; set; }
}
public class ShowTest2Info
{
public Test2Info TestInfo { get; set; }
}
private ObservableCollection<ShowTest2Info> test2InfoList;
public ObservableCollection<ShowTest2Info> Test2InfoList
{
get { return test2InfoList; }
set { test2InfoList = value; }
}
<DataGrid CanUserDeleteRows="False" CanUserAddRows="False" FontSize="16" ItemsSource="{Binding Test2InfoList}" AutoGenerateColumns="False"
Margin="0,5,0,5" IsReadOnly="True" SelectionMode="Single" BorderBrush="SkyBlue" BorderThickness="3" >
<DataGrid.Columns>
<DataGridTextColumn Header="产品码" Binding="{Binding Test2Info.ID}" IsReadOnly="True"/>
<DataGridTextColumn Header="操作员ID" Binding="{Binding Test2Info.IdOperator}" IsReadOnly="True"/>
<DataGridTextColumn Header="内箱码1" Binding="{Binding Test2Info.InnerBoxCode1}" IsReadOnly="True"/>
<DataGridTextColumn Header="内箱码2" Binding="{Binding Test2Info.InnerBoxCode2}" IsReadOnly="True"/>
<DataGridTextColumn Header="每包数量" Binding="{Binding Test2Info.Number}" IsReadOnly="True"/>
<DataGridTextColumn Header="打包时间" Binding="{Binding Test2Info.TestTime}" IsReadOnly="True"/>
</DataGrid.Columns>
</DataGrid>
如上代码所示,第二个表格的数据在Test2InfoList中可以看到,但是表格中一直不显示,折腾了很久才发现,关键是ShowTest2Info类定义的属性名和表格中绑定的的列属性名称没对映上,类定义中为:public Test2Info TestInfo { get; set; } ,而表格属性绑定中为:<DataGridTextColumn Header="产品码" Binding="{Binding Test2Info.ID}" IsReadOnly="True"/>,一个是TestInfo一个是Test2Info,当把类属性定义改为public Test2Info Test2Info { get; set; }即可,或者把表格属性定义改为<DataGridTextColumn Header="产品码" Binding="{Binding TestInfo.ID}" IsReadOnly="True"/>,也可以。
第一次写,其他小伙伴不知道能看懂否,后续多练练😀