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
相关产品推荐
相关产品推荐

