Как привязать данные к DataGrid, присутствующему в UserControl в WPF

Здесь у меня есть мой 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>

Я использую этот контроль в моем главном окне, скажем, в разных местах. Вот мое главное окно.код 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. Вот мое главное окно.цезий

 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»

EDIT 2
Как уже упоминалось, я добавил

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

in StudentDetailsно получение исключения Null Reference. Даже если

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

добавленные данные не отображаются в DataGrid.

1 ответ

  1. Я думаю, что вы на правильном пути, установив DataContext ваших UserControls. Проблема в том, что вы устанавливаете DataContext на «запрос», который ограничивает то, к чему ваши элементы управления внутри UserControl могут привязаться.

    Элементы управления DataGrid ожидают список того, к чему нужно привязаться. При использовании » student1.DataContext = request «+ ItemsSource= «{Binding} » на вашей сетке , вы по существу привязка сетки к одной сущности.

    Вместо этого следует привязать сетку к самой таблице DataTable. Попробуйте настроить DataContext следующим образом-student1.DataContext = dataTable.DefaultView;

    Если необходимо привязать одновременно и метки, и DataGrid, необходимо создать ViewModel, объединяющий все данные, необходимые UserControl, и использовать его в качестве DataContext. ViewModels необходимы для WPF. Если вы не изучали их, я предлагаю вам это сделать. Вот достойное введение-Model-View-ViewModel (MVVM) объяснено .