Silverlight绑定集合内部的集合

时间:2011-03-08 10:30:53

标签: silverlight xaml binding wcf-ria-services

我有一个可观察的团队集合,然后绑定到RadGridview。没问题。我能够在第一列填充我的网格中的团队名称。第二栏将列出主教练。在我的团队收藏中,我有另一个包含主教练的KeyPeople系列。所以我正在努力弄清楚如何将第二列绑定到另一个集合。

我在我的视图模型中有这个

TeamResults = new ObservableCollection<Teams>(_context.Teams);

KeyPeopleResults = new ObservableCollection<KeyPerson>(TeamResults.Select(x => x.KeyPerson).Where(g => g.RelationshipType == "Coach"));

但是我无法将gridview绑定到两个不同的数据源。 TeamResults拥有我需要的一切。

3 个答案:

答案 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可以是教练的名称。