如何将数据绑定到WPF中UserControl中存在的DataGrid [英] How to bind data to the DataGrid present in the UserControl in WPF

查看:153
本文介绍了如何将数据绑定到WPF中UserControl中存在的DataGrid的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这里我的UserControl为:

 < Border Grid.Column =0BorderBrush =BlackBorderThickness =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 =0Grid.Column =0Content =学生姓名/>
< TextBlock Text ={Binding NAME}Grid.Column =1Grid.Row =0Horizo​​ntalAlignment =LeftVerticalAlignment =Center/>
< Label Grid.Row =1Grid.Column =0Content =Roll No/>
< TextBlock Text ={Binding ROLL_NO}Grid.Column =1Grid.Row =1Horizo​​ntalAlignment =LeftVerticalAlignment =Center/>
< Label Grid.Row =2Grid.Column =0Content =班级教师姓名/>
< TextBlock Text ={Binding CLASS_TEACHER}Grid.Column =1Grid.Row =2Horizo​​ntalAlignment =LeftVerticalAlignment =Center/>
< DataGrid Grid.Row =3Grid.ColumnSpan =2x:Name =dg_MarksIsReadOnly =FalseItemsSource ={Binding}ColumnWidth =*RowHeaderWidth =0 VerticalAlignment =TopCanUserAddRows =FalseHeight =78AutoGenerateColumns =False>
< DataGrid.Columns>
< DataGridTextColumn IsReadOnly =TrueBinding ={Binding TEST_NO}Header =Test No/>
< DataGridTextColumn IsReadOnly =TrueBinding ={Binding ENGLISH}Header =English/>
< DataGridTextColumn IsReadOnly =TrueBinding ={Binding SOCIAL}Header =Social/>
< DataGridTextColumn IsReadOnly =TrueBinding ={Binding SCIENCE}Header =Science/>
< /DataGrid.Columns>
< / DataGrid>
< / Grid>
< / Border>

我在MainWindow中使用这个控件说不同的地方。这是我的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 =student1Margin =10,25,5,0Width =250Height =200VerticalAlignment =Top/>
< Label Content =Student2:Grid.Column =1/>
< local:StudentUserControl Grid.Column =1x:Name =student2Margin =10,25,5,0Width =250Height =200VerticalAlignment =Top/ >
< Label Content =Student3:Grid.Column =2/>
< local:StudentUserControl Grid.Column =2x:Name =student3Margin =10,25,5,0Width =250Height =200VerticalAlignment =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);

//如何将数据绑定到UserControl的数据网络

student1.DataContext = request;
}

我的StudentDetails类看起来像

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

所以我的问题是如何将datatable中的数据绑定到dataGrid 。我要改变的地方请给我建议。



编辑:
我想我必须添加一些StudentDetails p>

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

  public List< StudentMarkDetails> StudentMarks {get;组; $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 

$ 。即使

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

已添加数据未显示在DataGrid中。

解决方案

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



DataGrid控件预期要绑定的东西的列表。当您在网格上使用 student1.DataContext = request + ItemsSource ={Binding}时,您本质上将网格绑定到单个实体。 p>

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



如果您需要绑定您的标签和DataGrid同时,您将必须创建一个ViewModel,它将UserControl所需的所有数据组合起来,并将其用作DataContext。 ViewModels对于WPF至关重要。如果你还没有学习,我建议你做。这里是体面的介绍 - Model-View-ViewModel(MVVM)解释


Here I have my UserControl as:

<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>

I am using this control in my MainWindow say at different places. Here is my 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>

I am able bind the data from my Database to the labels. But I am unable to bind the data to the DataGrid. Here is my 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;
    }

And my StudentDetails class looks like

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

So My problem is how can I bind the data in datatable to the dataGrid. Where I have to change please suggest me.

EDIT: I think I have to add something to "StudentDetails"

EDIT 2 As mentioned I added

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

in StudentDetails but getting Null Reference Exception. Even though

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

was added data is not showing in the DataGrid.

解决方案

I think you are on the right track by setting the DataContext of your UserControls. The problem is that you are setting the DataContext to "request" which limits to what your controls inside the UserControl can bind to.

The DataGrid controls expects a list of something to bind to. When you are using "student1.DataContext = request" + ItemsSource="{Binding}" on your grid, you are essentially binding the grid to a single entity.

What you should do instead is bind the grid to the DataTable itself. Try setting the DataContext like this - student1.DataContext = dataTable.DefaultView;

If you need to bind both your labels and the DataGrid at the same time, you will have to create a ViewModel that combines all of the data that is needed by your UserControl and use that as a DataContext. ViewModels are essential to WPF. If you haven't studied them I suggest you do. Here is decent introduction - Model-View-ViewModel (MVVM) Explained.

这篇关于如何将数据绑定到WPF中UserControl中存在的DataGrid的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆