如何将数据绑定到WPF中UserControl中的DataGrid

本文关键字:UserControl 中的 DataGrid WPF 数据绑定 | 更新日期: 2023-09-27 18:16:20

这里我的UserControl为:

<Border Grid.Column="0" BorderBrush="Black" BorderThickness="2">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="30"/>
            <RowDefinition Height="30"/>
            <RowDefinition Height="80"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="5*"/>
            <ColumnDefinition Width="5*"/>
        </Grid.ColumnDefinitions>
        <Label Grid.Row="0" Grid.Column="0" Content="Student Name"/>
        <TextBlock Text="{Binding NAME}" Grid.Column="1" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Center"/>
        <Label Grid.Row="1" Grid.Column="0" Content="Roll No"/>
        <TextBlock Text="{Binding ROLL_NO}" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Center"/>
        <Label Grid.Row="2" Grid.Column="0" Content="Class Teacher Name"/>
        <TextBlock Text="{Binding CLASS_TEACHER}" Grid.Column="1" Grid.Row="2" HorizontalAlignment="Left" VerticalAlignment="Center"/>
        <DataGrid Grid.Row="3" Grid.ColumnSpan="2" x:Name="dg_Marks" IsReadOnly="False" ItemsSource="{Binding}" ColumnWidth="*" RowHeaderWidth="0" VerticalAlignment="Top" CanUserAddRows="False" Height="78" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn IsReadOnly="True" Binding="{Binding TEST_NO}" Header="Test No" />
                <DataGridTextColumn IsReadOnly="True" Binding="{Binding ENGLISH}" Header="English" />
                <DataGridTextColumn IsReadOnly="True" Binding="{Binding SOCIAL}" Header="Social" />
                <DataGridTextColumn IsReadOnly="True" Binding="{Binding SCIENCE}" Header="Science" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Border>

我使用这个控件在我的主窗口说在不同的地方。这是我的mainwindow。xaml

 <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="3*"/>
        <ColumnDefinition Width="3*"/>
        <ColumnDefinition Width="3*"/>
    </Grid.ColumnDefinitions>
    <Label Content="Student1:" Grid.Column="0" />
    <local:StudentUserControl x:Name="student1" Margin="10,25,5,0" Width="250" Height="200" VerticalAlignment="Top" />
    <Label Content="Student2:" Grid.Column="1" />
    <local:StudentUserControl Grid.Column="1" x:Name="student2" Margin="10,25,5,0" Width="250" Height="200" VerticalAlignment="Top" />
    <Label Content="Student3:" Grid.Column="2" />
    <local:StudentUserControl Grid.Column="2" x:Name="student3" Margin="10,25,5,0" Width="250" Height="200" VerticalAlignment="Top" />
</Grid>

我可以将数据库中的数据绑定到标签。但是我无法将数据绑定到DataGrid。这是我的mainwindow。cs

 private void ShowDetails(string strName)
    {
        StudentDetails request = new StudentDetails();
        String retrieveCommand = "Select * from STUDENT_DETAILS where NAME='" + strName + "'";
        DataTable dataTable = MDBConnection.RetreiveTableData(retrieveCommand);
        request.NAME = dataTable.Rows[0]["NAME"].ToString();
        request.ROLL_NO = dataTable.Rows[0]["ROLL_NO"].ToString();
        request.CLASS_TEACHER = dataTable.Rows[0]["CLASS_TEACHER"].ToString();
         retrieveCommand = "Select * from STUDENT_MARKS_DETAILS where NAME='" + strName + "'";
         dataTable = MDBConnection.RetreiveTableData(retrieveCommand);
        // How to bind data to the datagrid of the UserControl
        student1.DataContext = request;
    }

我的StudentDetails类看起来像

 public class StudentDetails
{
    public String NAME { get; set; }
    public String ROLL_NO { get; set; }
    public String CLASS_TEACHER { get; set; }
}

所以我的问题是如何将datatable中的数据绑定到dataGrid。我需要在哪里换车,请告诉我。

编辑:

我想我必须添加一些东西到"StudentDetails"

编辑2 如前所述,我添加了

public List<StudentMarkDetails> StudentMarks { get; set; }

StudentDetails,但得到Null引用异常。即使

public List<StudentMarkDetails> StudentMarks = new List<StudentMarkDetails>();

如何将数据绑定到WPF中UserControl中的DataGrid

添加的数据没有显示在DataGrid中。

我认为你是在正确的轨道上设置你的UserControls的DataContext。问题是您将DataContext设置为"request",这限制了您在UserControl中的控件可以绑定到的内容。

DataGrid控件需要一个要绑定到的对象的列表。当你使用"student1。DataContext = request + ItemsSource="{Binding}"在你的网格上,你实际上是将网格绑定到单个实体。

你应该做的是将网格绑定到DataTable本身。尝试像这样设置数据上下文- student1。DataContext = dataTable.DefaultView;

如果你需要同时绑定你的标签和DataGrid,你将不得不创建一个ViewModel,它结合了你的UserControl需要的所有数据,并将其用作DataContext。视图模型对于WPF是必不可少的。如果你没有研究过它们,我建议你去研究一下。这里有一个像样的介绍-模型-视图-视图模型(MVVM)解释。