【问题标题】:Silverlight binding an collection with a collection insideSilverlight 将集合与内部集合绑定
【发布时间】:2011-07-11 00:22:07
【问题描述】:

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

我的视图模型中有这个

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

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

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

【问题讨论】:

    标签: silverlight xaml binding wcf-ria-services


    【解决方案1】:

    您可以为您的 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 服务生成的类编写客户端代码的原因。

    我已阅读您的 cmets 关于使用单独的查询来加载主教练的信息。您可能希望考虑在与您的团队相同的查询中下载您的 KeyPeople。您可以在服务器上使用.Include 语句来发送关键人员。

    如果这不是一个可行的解决方案,则在您的客户端代码中将 HeadCoach 设为 {get;set;} 属性。此外,由于 WCF RIA 是一个导航系统,如果您在 SAME DataContext 上进行单独查询作为第一个查询,关键人员导航系统将已经设置,从而使您的部分类的属性自动工作。

    玩得开心!

    【讨论】:

    • 我开始走转换器的路线..但这似乎更适合我们。实际上,对于使用 Ria 服务进行的值转换器和客户端更改都是一个很好的教训。我们在域服务中使用 .Include,这正是我们需要做的,并将在我们应用程序的其他领域中使用。 ...谢谢!
    【解决方案2】:

    听起来您需要向 ViewModel 添加 HeadCoach 属性。让该属性索引列表中的 HeadCoach。

    如果这不可行,请尝试在绑定中使用值转换器。像这样,请原谅伪代码。
    <Column Text="{Binding Path=KeyPeople, Converter={StaticResource FindHeadCoachConverter}"/>

    【讨论】:

      【解决方案3】:

      为什么不使用ObservableCollection&lt;KeyValuePair&lt;string, string&gt;&gt; 这样的数据结构?绑定会容易得多。

      key 可以是球队的名字,value 可以是教练的名字。

      【讨论】:

      • 我喜欢这个方向,但我不仅需要显示球队名称和教练......而且在包含个人数据的关键人物集合中,我需要显示教练姓名和他的所有联系人信息。电子邮件电话等。
      • 好吧。然后它只是有点复杂。您将需要一个 ViewModel。你熟悉 MVVM 吗?
      • 那么为这个View 设计一个ViewModel 并将其绑定到网格。
      • 在我目前用于此视图的视图模型中。我有一堆 RIA 服务调用,它们让我在最初的问题中获得了两个可观察的集合。我正在加载 Teams 并在域服务中包含在此加载调用中带回 keyPeople 的域服务。因此,可观察到的团队集合还包括关键人员。在该关键人员实体中是人员列表,其中一个是教练。
      • 我没有使用 RIA 服务的经验。但是您的方法似乎很奇怪。我认为更好的方法是检索具有已解决关系的数据(例如团队和教练或教练和他的联系数据)。它将最小化客户端的负载,因为服务器将完成所有复杂的工作。它还将使前端的实现更加容易。
      猜你喜欢
      • 2012-06-14
      • 2011-04-07
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多