【问题标题】:Silverlight databinding errorSilverlight 数据绑定错误
【发布时间】:2011-02-24 10:22:44
【问题描述】:

我在网上找到了一个示例,该示例解释了如何在 WPF 中使用 LINQ 对 ListBox 控件执行数据绑定。该示例工作正常,但是当我在 Silverlight 中复制相同的代码时,它不起作用。 Silverlight 和 WPF 之间是否存在我不知道的根本区别?

这是 XAML 的一个示例:

<ListBox x:Name="listBox1">
 <ListBox.ItemTemplate>
  <DataTemplate>
   <StackPanel>

     <TextBlock Text="{Binding Name}" FontSize="18"/>
     <TextBlock Text="{Binding Role}" />     

   </StackPanel>
  </DataTemplate>
 </ListBox.ItemTemplate>
</ListBox>

下面是我的代码示例:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
  string[] names = new string[] { "Captain Avatar", "Derek Wildstar", "Queen Starsha" };
  string[] roles = new string[] { "Hero", "Captain", "Queen of Iscandar" };

  listBox1.ItemSource = from n in names from r in roles select new { Name = n, Role = r}
}

【问题讨论】:

    标签: wpf linq silverlight data-binding listbox


    【解决方案1】:

    Silverlight 不支持绑定到匿名类型。 (从技术上讲是正确的,Silverlight 不支持针对内部类型进行反射,并且由于匿名类型是内部的,因此这不起作用)。请参阅this article 了解简单的解决方法 - 您只需创建一个模型类来保存数据。

    public class MyItem
    {
       public string Name { get; set; }
       public string Role { get; set; }
    }
    
    listBox1.ItemSource = from n in names from r in roles select new MyItem() { Name = n, Role = r}
    

    【讨论】:

      【解决方案2】:

      在 Silverlight 中,您不能绑定到匿名类型。 Silverlight 要求绑定项目的类型为public,但匿名类型为internal。

      你需要创建一个公共类型来携带你的结果:-

      public class MyItem
      {
         public string Name {get; set; }
         public string Role {get; set; }
      }
      

      现在在您的代码中:-

      listBox1.ItemSource = from n in names from r in roles select new MyItem() { Name = n, Role = r}    
      

      【讨论】:

      • 所以……我说的正是?有一个投票按钮,您可以使用它来代替重复答案。
      • @Charlie:只有我用代码说明了。你会注意到我的回答比你的回答晚了 3 分钟。每次弹出“新答案”消息时,我都不会打扰它,我只是完成自己的答案。也许您应该通读常见问题解答。 SO不仅仅是给出一个的答案,而是试图给出质量的答案。这个想法是让 SO 成为快速清晰地获得答案的“goto”位置。我会告诉你什么,用代码示例提高你的答案的质量,让我知道,然后我会投票。 ;)
      • 好吧,如果您的代码具有启发性并且无法通过阅读我的答案立即推断出来,那么当然,这可能是值得的。但是,如果它只是简单地重述他的代码行并添加一个我相信我们的朋友可以管理的样板类,那么我会认为这是一个重复的答案。但是现在我已经添加了“teh codez”以便于复制粘贴,我想你可以支持我的答案。
      • @Charlie:我试图表现得友好并帮助你找到一些原因。当我发布我的答案时,我看到了你的答案,但当时我的 IMO 更好。也许您应该对 SO 遭受的“西部最快的枪支”问题进行一些研究,并且在某种程度上仍然存在。你含蓄的指责很糟糕,我觉得它很冒犯。但是,正如我所说,我已经对您的答案表示赞同,尽管现在而不是像我打算的那样心甘情愿,但很不情愿。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多