2016-11-04 69 views
0

在这里,我有我的用户为:如何将数据绑定到存在于用户控件DataGrid中的WPF

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

所以我的问题是我怎么能数据绑定在数据表到DataGrid。我必须改变的地方请给我建议。

编辑: 我想我要补充的东西 “StudentDetails”

EDIT 2 如前所述我StudentDetails但得到空引用异常增加

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

。即使

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

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

+0

你检查在计算器上其他类似的问题吗?看来,他们中的几个应该能够推动你在正确的方向 http://stackoverflow.com/questions/20770438/how-to-bind-datatable-to-datagrid http://stackoverflow.com /问题/ 30445620 /绑定数据表到A-数据网格式,WPF –

+0

@MilanNankov是的,我找遍了所有这些问题已经在这里我的问题是,我想添加数据的DataGrid出现在用户控件。我无法直接访问数据网格及其名称。 – Gopi

+0

创建一个类似于“StudentMarkDetails”的类,将该类的集合添加到“StudentDetails”中,从“ShowDetails”方法填充该集合,并将绑定更改为指向它。例如,如果添加'公共列表 StudentMarks {get;组; }'到'StudentDetails'类,那么你的dg_Marks绑定将是'ItemsSource =“{Binding StudentDetails}”' – Rachel

回答

0

我认为你是通过设置用户控件的DataContext的正确轨道上。问题在于你将DataContext设置为“请求”,这限制了UserControl内部的控件可以绑定到的内容。

数据网格控件预计的东西绑定到一个列表。当您使用“student1.DataContext =请求” + 的ItemsSource =您的网格“{结合}”,你基本上是结合网格以一个单一的实体。

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

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

+0

只是在我的问题上有点改变,我从两个不同的表中获取数据。所以我不能直接绑定dataTable本身到userControl。我想我应该给我的STUDENTDETAILS课增加一些东西 – Gopi