2016-12-21 1 views
1

WPF의 목록 상자에 목록을 바인딩하려고합니다. 하지만 작동하지 않는 것 같습니다. 화면에 아무것도 표시되지 않습니다. 당신은 아마 알다시피, 주문은 사용자 정의 클래스이기 때문에 Klantgegevens가wpf의 listboxitem에 바인드 목록

WPF

<ListBox x:Name="listBox" HorizontalAlignment="Left" Height="453" VerticalAlignment="Top" Width="119" Margin="0,43,0,0" ItemsSource="{Binding orderlist}"> 
     <ListBoxItem Content="{Binding orderlist.ID}"></ListBoxItem> 
    </ListBox> 

C#을

Order order = new Order(); 
Klantgegevens klantgegevens = new Klantgegevens(); 
      XmlReader rdr = XmlReader.Create(@"C:\Users\Gebruiker\Desktop\EDI\Rekening.xml"); 
      rdr.ReadToFollowing("datum"); 
      order.DatumOntvangst = rdr.ReadElementContentAsString(); 
      rdr.ReadToFollowing("volgnr"); 
      order.Status = "Aangenomen"; 
      order.Opmerkingen = ""; 
      rdr.ReadToFollowing("naam"); 
      order.Afzender = rdr.ReadElementContentAsString(); 
      rdr.ReadToFollowing("naam"); 
      klantgegevens.Naam = rdr.ReadElementContentAsString(); 
      rdr.ReadToFollowing("straat"); 
      klantgegevens.Straat = rdr.ReadElementContentAsString(); 
      rdr.ReadToFollowing("huisnr"); 
      klantgegevens.Huisnummer = rdr.ReadElementContentAsInt(); 
      rdr.ReadToFollowing("plaats"); 
      klantgegevens.Woonplaats = rdr.ReadElementContentAsString(); 
      rdr.ReadToFollowing("postcode"); 
      klantgegevens.Postcode = rdr.ReadElementContentAsString(); 
      rdr.ReadToFollowing("telefoonnr"); 
      klantgegevens.Telefoonnummer = rdr.ReadElementContentAsString(); 
      order.Klantgegevens = klantgegevens; 
      orderlist.Add(order); 
      listBox.DataContext = orderlist; 

:

여기 내 코드입니다. 나는 바인딩 및 일반적으로 WPF 꽤 새로운 해요 그래서

<ListBoxItem Content="{Binding orderlist.ID}"></ListBoxItem> 

당신이 XAML에서 항목을 추가로 내 stupidness :

답변

2

ListView의 ItemsSource 속성을 IEnumerable로 설정하거나 바인딩해야합니다. DataContext 속성을 "orderlist"로 설정 했으므로 ItemsSource 속성을 DataContext에 직접 바인딩해야합니다 (ItemsSource = "{Binding}"). Fruchtzwerg에 의해 제안 당신은 또한 ItemTemplate을 사용해야합니다 :

<ListBox x:Name="listBox" HorizontalAlignment="Left" Height="453" VerticalAlignment="Top" Width="119" Margin="0,43,0,0" ItemsSource="{Binding}"> 
    <ListBox.ItemTemplate> 
      <DataTemplate> 
        <TextBlock Text="{Binding ID}" /> 
      </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

는 또한 ItemTemplate을의 DataContext에 당신의 ItemsSource의 항목,이 경우 즉 주문 개체입니다 있습니다. 따라서 Order 객체의 "ID"속성에 바인딩하려면 위의 바인딩 구문을 사용합니다. "ID"는 Order 클래스의 public 속성이어야합니다.

+0

맞아요 올바른 방향으로 한 걸음 내딛겠습니다. 목록에 뭔가를 추가 할 때만 처음 작동합니다. –

+0

런타임시 ListBox에 항목을 동적으로 추가하려면 ItemsSource 속성을로 설정해야합니다 ObservableCollection 대신 목록 이 있습니다. ObservableCollection은 변경 알림을 제공하지만 목록에는 포함되어 있지 않습니다. https://msdn.microsoft.com/en-us/library/ms668604%28v=vs.110%29.aspx – mm8

+0

마지막 질문은 내가 할 수있는 경우 어떻게 작성합니까? 해당 목록 상자의 항목에 이벤트를 만들 수 있습니까? 클릭 한 항목에 어떤 텍스트가 있는지보고 싶으면 –

1

실례. 그러나 바인딩 된 항목을 표시 할 템플릿을 만드는 것이 계획입니다. 가장 간단한 해결책은 하나의 속성 만 표시해야하는 경우 사용하는 것입니다.

<ListBox x:Name="listBox" DisplayMemberPath="ID"/> 

여러 속성은 또한 당신이 결합하는

public ObservableCollection<Klantgegevens> Items { get; } = 
    new ObservableCollection<Klantgegevens>(); 

같은 속성을 사용한다

<ListView x:Name="listBox"> 
     <ListView.ItemTemplate> 
       <DataTemplate> 
         <StackPanel> 
           <TextBlock Text="{Binding ID}" /> 
           <TextBlock Text="{Binding datum}"/> 
           <!-- ... --> 
         </WrapPanel> 
       </DataTemplate> 
     </ListView.ItemTemplate> 
</ListView> 

같은 템플릿을 생성하여 보여 할 수 있습니다. 이 속성을 사용하여 ListView으로 전체 창 중 DataContext을 개체에 설정합니다. 그 후에는 ListView를 바인딩 할 수 있습니다.

관련 문제