【问题标题】:XAML ListBox only shows class nameXAML ListBox 仅显示类名
【发布时间】:2011-07-12 11:59:47
【问题描述】:

如何让我的类属性显示在 ListBox 中?

XAML:

<ListBox x:Name="lstPlayers" >
     <DataTemplate>
          <StackPanel Orientation="Horizontal">
              <TextBlock Text="{Binding Player.FirstName}"></TextBlock>
              <TextBlock Text="{Binding Player.LastName}"></TextBlock>
          </StackPanel>
     </DataTemplate>
</ListBox>

C#:

public class Player
{
    string FirstName { get; set; }
    string LastName { get; set; }
}


public void LoadPlayers()
{
    foreach (Player player in Players)
    {
         lstPlayers.Items.Add(player);
     }
}

ListBox 中唯一显示的是

TestApplication1.Player

【问题讨论】:

    标签: c# wpf xaml data-binding listbox


    【解决方案1】:

    您当前的实施存在一些问题。首先,DataTemplate 应放置在 ItemTemplate 中,用于ListBox。其次,每个ListBoxItem 的DataContext 将是Player 的一个实例,因此您应该直接绑定到FirstNameLastName。第三,Player 中的属性应该公开,以便 DataBinding 工作。

    <ListBox x:Name="lstPlayers" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding FirstName}"></TextBlock>
                    <TextBlock Text="{Binding LastName}"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    
    public class Player
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    

    另外,不要将集合逐项添加到ListBox,只需将其设置为ItemsSource

    lstPlayers.ItemsSource = Players;
    

    【讨论】:

    • +1 第二点,我看不到,因为在 iPhone StackOverflow 上没有显示代码部分的滚动,我只能看到“{Binding”...
    • @Akash Kava:我在 iPhone 上遇到了同样的问题,但我最近注意到,如果你用两根手指点击/按下代码,就无法滚动它。试试看:)
    • 非常感谢,它起作用了,可惜到目前为止没有人告诉我!
    【解决方案2】:

    您必须将 DataType 添加到您的 DataTemplate。

    <DataTemplate DataType="{x:Type local:Player}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding FirstName}"></TextBlock>
                <TextBlock Text="{Binding LastName}"></TextBlock>
            </StackPanel>
        </DataTemplate>
    

    local 是 TestApplication1.Player 的命名空间。您可以将数据模板设置为 listebox.itemtemplate 或作为任何“父对象”的资源

    【讨论】:

      【解决方案3】:

      设置集合,玩家为ItemSource

      <ListBox x:Name="lstPlayers" >
              <ListBox.ItemTemplate>
                  <DataTemplate>
                      <StackPanel Orientation="Horizontal">
                          <TextBlock Text="{Binding FirstName}"></TextBlock>
                          <TextBlock Text="{Binding LastName}"></TextBlock>
                      </StackPanel>
                  </DataTemplate>
              </ListBox.ItemTemplate>
          </ListBox>
      

      【讨论】:

        【解决方案4】:

        DataTemplate 应该在 ListBox.ItemTemplate 内。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多