2016-12-21 2 views
1

Я пытаюсь связать список со списком в WPF. Но, похоже, это не работает, я просто ничего не вижу на экране.Список привязки к listboxitem в wpf

Вот мой код:

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; 

Как вы, наверное, знаете, заказ пользовательский класс, и поэтому Klantgegevens. Я довольно новыми для связывания и WPF в общем, так, простите меня за stupidness :)

ответ

2

Вам необходимо установить или связать свойство ItemsSource из ListView в IEnumerable. Поскольку свойство DataContext установлено в ваш «список заказов», вы должны привязать свойство ItemsSource непосредственно к DataContext (ItemsSource = «{Binding}»). Вы должны также использовать ItemTemplate как предложено Fruchtzwerg:

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

отметить также, что DataContext в ItemTemplate является элементом в вашем ItemsSource, то есть объект заказа в этом случае. Поэтому для привязки к свойству «ID» объекта Order вы используете синтаксис привязки выше. «ID» должен быть публичным свойством класса Order.

+0

Спасибо, это один шаг в правильном направлении, я думаю, но он работает только в первый раз, когда я добавляю что-то в список. –

+0

Если вы хотите динамически добавлять элементы в ListBox во время выполнения, вы должны установить свойство ItemsSource для a ObservableCollection вместо списка . ObservableCollection предоставляет уведомления об изменениях, но в списке нет: https://msdn.microsoft.com/en-us/library/ms668604%28v=vs.110%29.aspx – mm8

+0

Последний вопрос, если можно, могу ли я сделать событие для элемента в этом списке. Скажем, хочу ли я видеть, какой текст находится в объекте с нажатой кнопкой –

1

С

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

вы добавляете элемент в XAML. Но ваш план заключается в создании шаблона для представления связанных элементов. Самое простое решение - использовать

<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>(); 

связываться с. Установите DataContext всего окна с ListView на объект с этим свойством. После этого вы можете связать ListView с

<ListView ItemsSource="{Binding Items}"/> 
Смежные вопросы