You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF ListBox网格列无法填充列表数据问题求助

问题排查:WPF ListBox列格式绑定无内容显示

问题场景

业余项目中为WPF ListBox填充数据,复制了另一款可正常显示列格式的ListBox的XAML与代码,但新ListBox无内容显示。移除网格列格式后可正常加载数据,说明数据源无问题,问题出在列格式绑定上。

原代码

Rounds类

namespace BettingPoker
{
internal class Rounds 
{
private string  RoundName { get; set; }
private int RoundNumber { get; set; }


public Rounds(string roundname,  int roundnumber)
{
    this.RoundName = roundname;
    this.RoundNumber = roundnumber;
  
}
    public static List<Rounds> roundList = new List<Rounds>();

    public void TilføjTilRound(string name, int number)
    {
        roundList.Add(new Rounds(name, number));
    }


    public override string ToString()
    {
        if (RoundName != null)
            return RoundName + "  " + RoundNumber;
        return "Problem";
    }
}
}

XAML代码

<ListBox x:Name="listBoxRunder" Height="135" Margin="478,244,170,0" 
VerticalAlignment="Top" ItemsSource="{Binding}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Margin="0,2">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="30"></ColumnDefinition>
                    <ColumnDefinition Width="2"></ColumnDefinition>
                    <ColumnDefinition Width="30"></ColumnDefinition>
                    <ColumnDefinition Width="2"></ColumnDefinition>
                  
                </Grid.ColumnDefinitions>

                <TextBox Text="{Binding RoundName}" Grid.Column="1"></TextBox>
                <TextBox Text="{Binding RoundNumber}" Grid.Column="3"></TextBox>
                
            </Grid>
        </DataTemplate>
      </ListBox.ItemTemplate>
</ListBox>

后台绑定代码

Rounds runde = new Rounds("", 0);
runde.TilføjTilRound("Blinds", 0);
runde.TilføjTilRound("Preflop", 1);
runde.TilføjTilRound("Flop", 2);
runde.TilføjTilRound("Turn", 3);
runde.TilføjTilRound("River", 4);

listBoxRunder.ItemsSource = Rounds.roundList;

问题原因

核心问题是Rounds类的RoundName和RoundNumber属性是private访问修饰符,WPF的数据绑定机制无法访问类的私有成员,导致模板中的TextBox无法获取到数据,所以显示为空。而移除网格列格式后,ListBox默认调用你重写的ToString()方法显示内容,所以能正常看到数据。

修改方案

将Rounds类的属性改为public,绑定机制就能正常读取属性值:

namespace BettingPoker
{
internal class Rounds 
{
// 改为public属性
public string RoundName { get; set; }
public int RoundNumber { get; set; }


public Rounds(string roundname, int roundnumber)
{
    this.RoundName = roundname;
    this.RoundNumber = roundnumber;
  
}
    public static List<Rounds> roundList = new List<Rounds>();

    public void TilføjTilRound(string name, int number)
    {
        roundList.Add(new Rounds(name, number));
    }


    public override string ToString()
    {
        if (RoundName != null)
            return RoundName + "  " + RoundNumber;
        return "Problem";
    }
}
}

额外优化建议

如果后续需要动态添加/删除数据时自动更新UI,可以把List<Rounds>替换为ObservableCollection<Rounds>,它实现了INotifyCollectionChanged接口,数据变化时会自动通知UI刷新:

public static ObservableCollection<Rounds> roundList = new ObservableCollection<Rounds>();

内容的提问来源于stack exchange,提问作者Jens Barfred

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:25:31