【问题标题】:Bind list to listboxitem in wpf将列表绑定到 wpf 中的 listboxitem
【发布时间】:2017-05-07 08:00:09
【问题描述】:

我正在尝试将列表绑定到 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;

您可能知道,Order 是一个自定义类,Klantgegevens 也是如此。 总的来说,我对绑定和 WPF 还很陌生,所以请原谅我的愚蠢:)

【问题讨论】:

    标签: c# wpf binding listbox


    【解决方案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>();
    

    绑定。用这个属性将整个Window的DataContextListView设置为对象。之后,您可以将 ListView 与

    绑定
    <ListView ItemsSource="{Binding Items}"/>
    

    【讨论】:

      【解决方案2】:

      您需要将 ListView 的 ItemsSource 属性设置或绑定到 IEnumerable。由于您已将 DataContext 属性设置为“订单列表”,因此您应该将 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 对象。因此,要绑定到 Order 对象的“ID”属性,您可以使用上面的绑定语法。 “ID”必须是 Order 类的公共属性。

      【讨论】:

      • 谢谢,我猜这是朝着正确方向迈出的一步,但它只在我第一次向列表中添加内容时起作用
      • 如果您希望能够在运行时动态地将项目添加到 ListBox,您应该将 ItemsSource 属性设置为 ObservableCollection 而不是 List。 ObservableCollection 提供更改通知,但 List 不提供:msdn.microsoft.com/en-us/library/ms668604%28v=vs.110%29.aspx
      • 最后一个问题,如果可以的话,我怎样才能为该列表框中的项目创建一个事件。说如果我想看看点击的项目中有什么文字
      • 这确实是另一个问题,但您可以例如为 ItemTemplate 中的根元素处理 MouseLeftButtonDown 事件:stackoverflow.com/questions/9213030/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 2011-07-29
      • 2010-12-16
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多