如何绑定到子对象数组中的第一个元素?

问题描述:

我试图在DataGrid列中以用户电子邮件的形式在数组中显示第一封电子邮件。如何绑定到子对象数组中的第一个元素?

这是我得到的数据:

IEnumerable<User> dgUsers; 
dgUsers = Context.Users.Where(u => u.Location == "UK") 
       .Include(j => j.Emails).ToList(); 

这是我的XAML:

<DataGrid x:Name="dataGrid" ItemsSource="{Binding dgUsers}" HorizontalAlignment="Stretch" Margin="10,37,10,10" VerticalAlignment="Stretch" 
       CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="True" AutoGenerateColumns="False"> 
     <DataGrid.Columns > 
      <DataGridTextColumn Header="Name" Binding="{Binding Name}" /> 
      <DataGridTextColumn Header="Surname" Binding="{Binding Surname}" /> 
      <DataGridTextColumn Header="Location" Binding="{Binding Location}" /> 
      <DataGridTextColumn Header="Email" Binding="{Binding Emails[0].Email}" Width="350" /> 
      <DataGridTextColumn Header="LastLogon" Binding="{Binding LastLogon}" /> 
     </DataGrid.Columns> 

    </DataGrid> 

用户类定义:

public class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Surname { get; set; } 
    public string Location { get; set; } 
    public DateTime LastLogon { get; set; } 
    public virtual ICollection<Mail> Emails { get; set; } 
} 
public class Mail 
{ 
    public int Id { get; set; } 
    public int UserId { get; set; } 
    public string Email { get; set; } 
} 

不知道我在做什么错误,网格显示但电子邮件列是空的?

常用的方法是创建UserViewModel,将第一封电子邮件定义为属性。所以你的查询将是类似的。

IEnumerable<UserViewModel> dgUsers; 
dgUsers = Context.Users.Where(u => u.Location == "UK") 
         .Include(j => j.Emails) 
         .Select(u => new UserViewModel() { /* some user properties */ Email = u.Emails.FirstOrDefault() }).ToList(); 

UPDATE

ICollection接口不声明一个索引。所以我建议你用IList来解决你的问题。

+0

感谢您的回答。我知道我可以创建ViewModel来做同样的事情。但我的问题与嵌套绑定有关。我知道这是可能的,只是不知道为什么它不适用于我的例子。 – Whistler

+0

对不起,我误解了,你能否用'user'类定义更新你的文章 –

+0

'ICollection'接口没有声明索引器。所以我建议你使用[IList](https://msdn.microsoft.com/en-us/library/5y536ey6.aspx)来解决你的问题。 –