WPF DataGrid 不显示数据

文章讲述了在使用DataGrid时遇到数据不显示的问题,通过检查发现是MVVM模式下ObservableCollection数据源绑定时的命名错误导致。作者提供了详细的代码示例,解释了如何正确绑定数据以及修复此类问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        今天在用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"/>,也可以。    

    第一次写,其他小伙伴不知道能看懂否,后续多练练😀

### WPF DataGrid显示的原因及解决方案 WPF DataGrid 显示的问题可能由多种原因引起,以下是常见的原因及其对应的解决方案: #### 1. 数据源未正确绑定 如果 `DataGrid` 的数据源未正确设置或为空,则可能导致表格内容显示。确保 `ItemsSource` 属性已绑定到有效的数据集合。 ```xml <DataGrid x:Name="MyDataGrid" ItemsSource="{Binding MyDataSource}" /> ``` 若数据源为 `null` 或无数据,列头也可能显示[^1]。因此需要确保数据源始终有效。 --- #### 2. 列宽设置问题 当 `DataGrid` 的列宽被设置为自适应宽度(如 `Width="*"` 或 `Width="2*"`),并且没有足够的数据填充时,列头可能显示。可以通过以下方式解决: - 设置最小列宽: ```xml <DataGrid MinColumnWidth="80"> <DataGridTextColumn Width="*" /> <DataGridTextColumn Width="2*" /> </DataGrid> ``` - 或者为每个列设置最小宽度: ```xml <DataGrid> <DataGridTextColumn Width="*" MinWidth="100" /> <DataGridTextColumn Width="2*" MinWidth="100" /> </DataGrid> ``` - 或者直接设置固定宽度: ```xml <DataGrid> <DataGridTextColumn Width="100" /> <DataGridTextColumn Width="200" /> </DataGrid> ``` 上述方法可以确保即使没有数据时,列头仍然可见[^1]。 --- #### 3. 单元格内容显示 如果单元格内容显示,可能是由于绑定路径设置错误或特殊字符导致。可以通过监听 `AutoGeneratingColumn` 事件来修正绑定路径: ```csharp private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { string columnName = e.PropertyName; if (e.Column is DataGridBoundColumn && (columnName.Contains(".") || columnName.Contains("\\") || columnName.Contains("/") || columnName.Contains("[") || columnName.Contains("]") || columnName.Contains("(") || columnName.Contains(")"))) { DataGridBoundColumn dataGridBoundColumn = e.Column as DataGridBoundColumn; dataGridBoundColumn.Binding = new Binding("[" + e.PropertyName + "]"); } } ``` 通过上述代码,可以处理包含特殊字符的列名绑定问题[^3]。 --- #### 4. 外部样式或模板冲突 如果应用了外部样式或模板,可能会导致 `DataGrid` 的默认行为被覆盖,从而隐藏其内容。检查是否存在类似的资源定义: ```xml <Style TargetType="DataGrid"> <!-- 确保未覆盖关键属性 --> </Style> ``` --- #### 5. 滚动条相关问题 如果滚动条未正确配置,可能导致部分内容可见。例如,垂直滚动条被隐藏时,可能看到某些行。可以通过以下方式解决: ```xml <DataGrid VerticalScrollBarVisibility="Auto" /> ``` 或者使用外部滚动条控件同步滚动行为[^2]。 --- #### 6. 其他潜在问题 - **视图模型未正确实现 `INotifyPropertyChanged`**:确保数据源实现了 `INotifyPropertyChanged` 接口,以便 `DataGrid` 能够响应数据变化。 - **列生成模式问题**:如果启用了 `AutoGenerateColumns="False"`,但未手动定义列,则可能导致内容显示。 --- ### 示例代码 以下是一个完整的示例,展示如何避免常见问题: ```xml <Window x:Class="WpfApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DataGrid Example" Height="450" Width="800"> <Grid> <DataGrid x:Name="MyDataGrid" AutoGenerateColumns="True" MinColumnWidth="80" VerticalScrollBarVisibility="Auto"> <DataGrid.Columns> <DataGridTextColumn Header="Column 1" Width="*" Binding="{Binding Property1}" /> <DataGridTextColumn Header="Column 2" Width="2*" Binding="{Binding Property2}" /> </DataGrid.Columns> </DataGrid> </Grid> </Window> ``` ```csharp public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); MyDataGrid.ItemsSource = new List<MyModel> { new MyModel { Property1 = "Value1", Property2 = "Value2" }, new MyModel { Property1 = "Value3", Property2 = "Value4" } }; } } public class MyModel { public string Property1 { get; set; } public string Property2 { get; set; } } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值