如何使用Entity Framework 6将特定列绑定到DataGrid?

时间:2017-07-11 00:06:05

标签: wpf vb.net entity-framework linq datagrid

我有一个包含~20列的SQL表。我想从中拉出3列并在我的前端WPF应用程序中填充数据网格。到目前为止,这是我的代码。

 Private Sub AccountSelectorDialogue_load(ByVal sender As Object, ByVal e 
 As EventArgs) Handles MyBase.Loaded

    Try
        Dim context As MyDatabase = New MyDatabase

        Dim qry_Accounts = From accounts In context.tbl_Accounts
                           Order By accounts.AccName
                           Select {accounts.AccName, accounts.AccPhone, accounts.ParentAcc}
        Dim results = qry_Accounts.ToList()

        AccountDataGrid.DataContext = results

    Catch ex As Exception
        MessageBox.Show("Error while selecting record from table..." & ex.Message, "Select Records")
        MessageBox.Show(ex.InnerException.Message)
    End Try

End Sub

当我加载数据网格时,我得到this异常和this内部异常。我觉得我缺少一些基本的东西,但我没有看到它。

编辑:当我像这样写Select行并删除results变量时,异常消失。

 Select {accounts.AccName, accounts.AccPhone,      accounts.ParentAcc}.ToList()
 AccountDataGrid.DataContext = qry_Accounts

但是,数据网格仍然没有显示任何内容。

编辑2:使用ItemsSource代替DataContext。现在数据网格显示了正确的行数 - 但它们是空的......

编辑3:在我的屏幕上盯着几个小时之后,我想这可能是我的xaml。最初我不认为我必须绑定我的列。如果我确实需要,我不知道如何在这种情况下。

<DataGrid x:Name="AccountDataGrid" ItemsSource="{Binding}"      
HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="480" 
MinHeight="200"  VerticalScrollBarVisibility="Auto" 
HorizontalScrollBarVisibility="Auto" AutoGenerateColumns="False" 
Background="Transparent" >
                <DataGrid.Columns>
                    <DataGridTextColumn x:Name="AccountName" Binding="
{Binding AccName}" Header="Account Name" Width="Auto" MinWidth="180"/>
                    <DataGridTextColumn x:Name="PhoneNumber" Binding="
{Binding AccPhone}" Header="Phone" Width="Auto" MinWidth="150"/>
                    <DataGridTextColumn x:Name="AccountOwnerAlias" 
 Binding="{Binding ParentAcc}" Header="Account Owner Alias" Width="Auto" 
 MinWidth="150"/>
                </DataGrid.Columns>
            </DataGrid>

1 个答案:

答案 0 :(得分:1)

由于您只能绑定到公共属性,因此您需要定义匿名类型的属性:

Select New With { .AccName = accounts.AccName, .AccPhone = accounts.AccPhone, .ParentAcc = accounts.ParentAcc }.ToList()
AccountDataGrid.DataContext = qry_Accounts

如果您希望能够编辑记录,则应定义一个具有三个属性(YourClassAccNameAccPhone)的类(ParentAcc)和将DataContext设置为IEnumerable(Of MyClass)

Select New YourClass With { .AccName = accounts.AccName, .AccPhone = accounts.AccPhone, .ParentAcc = accounts.ParentAcc }.ToList()