Ошибка привязки данных Silverlight - PullRequest
1 голос
/ 27 мая 2010

В Интернете я нашел пример, объясняющий, как выполнить привязку данных к элементу управления ListBox с помощью LINQ в WPF. Пример работает нормально, но когда я копирую тот же код в 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}
}

Ответы [ 2 ]

1 голос
/ 27 мая 2010

В 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}    
1 голос
/ 27 мая 2010

Silverlight не поддерживает привязку к анонимным типам. (Чтобы быть технически правильным, Silverlight не поддерживает отражение от внутренних типов, и поскольку анонимные типы являются внутренними, это не работает). См. эту статью для простого обходного пути - вам просто нужно создать класс модели для хранения данных.

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}
...