2016-12-21 6 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にはかなり新しいですので、私のstupidnessのため恐れ入ります:)

答えて

2

ListViewのItemsSourceプロパティをIEnumerableに設定またはバインドする必要があります。 DataContextプロパティを "orderlist"に設定したので、ItemsSourceプロパティを直接DataContextにバインドする必要があります(ItemsSource = "{バインディング}")。 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オブジェクトであることに注意してください。したがって、Orderオブジェクトの "ID"プロパティにバインドするには、上記のバインディング構文を使用します。 "ID"はOrderクラスのパブリックプロパティでなければなりません。

+0

ありがとうございます。私は推測して正しい方向に進んでいますが、リストに何かを追加するのは初めてです。 –

+0

ListBoxにアイテムを動的に追加するには、ItemsSourceプロパティをリストの代わりにObservableCollection ObservableCollectionは変更通知を提供しますが、Listはそうではありません。https://msdn.microsoft.com/en-us/library/ms668604%28v=vs.110%29.aspx – mm8

+0

最後に質問がある場合は、 そのリストボックス内の項目に対してイベントを作成できますか?クリックしたアイテムのテキストを確認したい場合は –

1

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

を使用すると、XAMLで項目を追加しています。しかし、あなたの計画は、バインドされたアイテムを提示するためのテンプレートを作成することです。最も簡単な解決策は、1つのプロパティのみを提示する必要がある場合には、

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

を使用することです。複数のプロパティは

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

さらにあなたがバインドする

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

のようなプロパティを使用する必要がありますようにテンプレートを作成することであったことができます。このプロパティを使用して、ListViewのウィンドウ全体のDataContextをオブジェクトに設定します。その後、ListViewをバインドすることができます。

関連する問題