【问题标题】:Items doesn't appear in ListBox in C#, but in XAML yes项目不会出现在 C# 中的 ListBox 中,但在 XAML 中是
【发布时间】:2013-08-08 10:52:38
【问题描述】:

我对 ListBox 有一点问题。 如果我通过代码添加一个项目,因为它:

ListBox1.Items.Add(new MyData());
<ListBox Name="ListBox1" Height="Auto"
                    Style="{DynamicResource MyListBoxStyle}"/>

我的 ListBox 什么也不显示,而 Items 包含我添加的大量项目。

但是,如果我将一个项目直接放在我的 XAML 和 c# 中,MyData 会正确显示:

ListBox1.Items.Add(new MyData());
<ListBox Name="ListBox1" Height="Auto"
                    Style="{DynamicResource MyListBoxStyle}">
                            <data:MyData/>
                        </ListBox>

任何人都知道如果我没有将项目放入我的 XAML 中为什么它不能正确显示,以及如何更正它?

提前谢谢你:)


[已解决] 添加项目时,我的 ListBox 已经显示。所以要解决这个问题,只需要求更新布局以通知 ItemSource 已更改:

ListBox1.UpdateLayout();

【问题讨论】:

  • wpf 中更好的技术是数据绑定。您应该将一个可观察集合绑定到列表框并将项目添加到您的可观察集合。这会导致列表框通知集合中的更改并刷新其显示的数据。

标签: c# wpf xaml listbox


【解决方案1】:

我认为是因为 ListBox1.Items 集合没有实现 INotifyPropertyChanged/INotifyCollectionChanged。您可以创建一个可观察的集合并将其分配给 ItemSource。

ObservableCollection<MyData> items = new ObservableCollection()

items.Add(new MyData());

ListBox1.ItemSource = items;

您没有看到它添加的原因是列表框已经创建/填充,并且当您在 Items 属性上调用 .Add 方法时,Items 的集合不会通知列表框。

【讨论】:

  • 很好的解决方法。从这个问题中很难判断 MyData 是否已经是一个集合。它暗示它是,所以你可能需要修改它。
  • 即使 MyData 是一个集合,它也会作为列表框的单个项目处理。关键是,使用 ListBox1.Items.Add 不会触发 UI 更新。 ItemSource 将。
  • 重读后我倾向于同意您对问题的解释。我试图解决代码问题,而不是问“为什么它的工作方式不同?”的实际问题。我已经删除了我的答案和 cmets 以避免偏离真正的问题。
  • 感谢您的帮助! “你没有看到它添加的原因是列表框已经创建/填充,并且项目的集合没有通知列表框”这句话让我的脑海中出现了“倾斜”。通过使用“ListBox1.UpdateLayout();”它有效,所以我认为问题是通知 :) 再次感谢您的帮助,问题已解决!
猜你喜欢
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
相关资源
最近更新 更多