2010-05-26 3 views
1

WPF에서 LINQ를 사용하여 ListBox 컨트롤에 데이터 바인딩을 수행하는 방법을 설명하는 온라인 예제를 발견했습니다. 이 예제는 잘 작동하지만 Silverlight에서 동일한 코드를 복제하면 작동하지 않습니다. Silverlight와 WPF 사이에 근본적인 차이점이 있습니까?Silverlight 데이터 바인딩 오류

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

답변

1

실버 라이트 익명 형식에 바인딩을 지원하지 않습니다

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

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

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

뒤에 내 코드의 예입니다 : 여기

는 XAML의 예입니다. 기술적으로 정확하려면 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} 
+0

당신의 대답은 완벽하게 내 데이터 바인딩 오류를 수정했습니다. 감사! – Petezah

1

익명 형식에는 바인딩 할 수 없습니다. 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}  
+0

그래서 ... 정확히 내가 말한거야? 답변을 복제하는 대신 사용할 수있는 투표 버튼이 있습니다. – Charlie

+0

@Charlie : 코드로만 설명했습니다. 당신은 나의 대답이 당신의 3 분 후에 도착했다는 것을 알게 될 것입니다. 나는 그것이 나올 때마다 "새로운 대답"메시지에 뛰어 드는 것을 귀찮게 생각하지 않는다. 나는 단지 내 자신의 대답을 완성한다. 아마도 FAQ를 읽어야합니다. 그래서 __an__ 대답을 제공하는 것이 아니라 __quality__ 대답을 제공하려고합니다. 아이디어는 SO를 "goto"장소로 만들어 신속하고 명확하게 답변을 얻는 것입니다. 나는 당신에게 코드 예제로 대답의 질을 향상시키고 알려주고, 그러면 투표 할 것입니다. ;) – AnthonyWJones

+0

당신의 코드가 계시적이었고 내 대답을 읽음으로써 즉시 추론 될 수 없다면, 그럴만 한 가치가있을 것입니다. 그러나 단순히 코드 줄을 다시 작성하고 여기에있는 친구가 관리 할 수있는 상용구 클래스를 추가하는 경우 중복 응답으로 간주 할 것입니다. 하지만 이제는 쉽게 복사하여 붙여 넣을 수 있도록 "teh codez"를 추가 했으므로 내 답변을 upvote 할 수 있다고 가정합니다. – Charlie

관련 문제