如何绑定到子对象数组中的第一个元素?
问题描述:
我试图在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来解决你的问题。
感谢您的回答。我知道我可以创建ViewModel来做同样的事情。但我的问题与嵌套绑定有关。我知道这是可能的,只是不知道为什么它不适用于我的例子。 – Whistler
对不起,我误解了,你能否用'user'类定义更新你的文章 –
'ICollection'接口没有声明索引器。所以我建议你使用[IList](https://msdn.microsoft.com/en-us/library/5y536ey6.aspx)来解决你的问题。 –