我有一个可观察的团队集合,然后绑定到RadGridview。没问题。我能够在第一列填充我的网格中的团队名称。第二栏将列出主教练。在我的团队收藏中,我有另一个包含主教练的KeyPeople系列。所以我正在努力弄清楚如何将第二列绑定到另一个集合。
我在我的视图模型中有这个
TeamResults = new ObservableCollection<Teams>(_context.Teams);
KeyPeopleResults = new ObservableCollection<KeyPerson>(TeamResults.Select(x => x.KeyPerson).Where(g => g.RelationshipType == "Coach"));
但是我无法将gridview绑定到两个不同的数据源。 TeamResults拥有我需要的一切。
答案 0 :(得分:2)
您可以为Team类创建客户端属性。
基于ItemsControl的控件的所有绑定都直接绑定到列表中显示的各个对象,而不是列表本身。同样的概念继续存在于您的VM:只需修改ViewModel也无济于事。您需要修改对象本身以包含您在xaml中创建的绑定对象的足够信息。
由于您使用的是WCF RIA服务,因此您可以创建适合您的客户端属性。希望您将RIA服务抽象为服务器端库和客户端库。
只需在DataContext所在的客户端库中创建Team类的一部分,然后编写与此类似的代码:
public partial Team
{
public KeyPerson HeadCoach
{
get
{
if (this.PeopleInTeam != null && this.PeopleInTeam.Any())
{
return this.PeopleInTeam.FirstOrDefault(g => g.RelationshipType == "Coach"));
}
return null;
}
}
}
然后在您的绑定中,您只需绑定到Team中的属性:
<data:DataGridTextColumn Binding="{Binding Name}" /> /*Team is implied as the object in each row is a Team*/
<data:DataGridTextColumn Binding="{Binding HeadCoach.Name}" />
<data:DataGridTextColumn Binding="{Binding HeadCoach.PhoneNumber}" />
这是一种非常常见的技术。这也是我们可以访问为WCF RIA服务生成的类编写客户端代码的原因。
我已经阅读了有关使用单独查询加载主教练的评论。您可能希望在与团队相同的查询中下载KeyPeople。您可以在服务器上使用.Include
语句向下发送关键人员。
如果这不是一个可能的解决方案,那么在您的ClientSide代码中将HeadCoach设为{get;set;}
属性。此外,由于WCF RIA是一个导航系统,如果您将SAME DataContext上的单独查询作为第一个查询,则已经设置了关键人物导航系统,从而使您的部分类属性自动工作。
玩得开心!
答案 1 :(得分:1)
听起来您需要向ViewModel添加HeadCoach属性。将该属性索引到列表中的HeadCoach。
如果这不可行,请尝试在绑定中使用值转换器。这样的事情,请原谅伪代码。
<Column Text="{Binding Path=KeyPeople, Converter={StaticResource FindHeadCoachConverter}"/>
答案 2 :(得分:0)
为什么不使用像ObservableCollection<KeyValuePair<string, string>>
这样的数据结构?绑定会容易得多。
key
可以是团队的名称,value
可以是教练的名称。