我在网上找到了一个示例,解释了如何在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}
}
答案 0 :(得分: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}
答案 1 :(得分:1)
在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}