【问题标题】:WPF. Group items in ListBox without ItemsSourceWPF。在没有 ItemsSource 的 ListBox 中对项目进行分组
【发布时间】:2015-09-16 11:41:11
【问题描述】:

我像这样向ListBox 添加项目;

tvProgramListBox.Items.Add(r);

添加所有对象后,我尝试将这样的项目分组;

CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(tvProgramListBox.Items);
PropertyGroupDescription groupDescription = new PropertyGroupDescription("date");
view.GroupDescriptions.Clear();
view.GroupDescriptions.Add(groupDescription);

或者像这样;

PropertyGroupDescription groupDescription = new PropertyGroupDescription("date");
tvProgramListBox.Items.GroupDescriptions.Clear();
tvProgramListBox.Items.GroupDescriptions.Add(groupDescription);

date 属性存在于项目中。但是,ListBox 不会对项目进行分组。当我之前使用ItemsSource 绑定时,分组正在工作。但是我的收藏中有很多项目,我决定将它们手动添加到后台线程中的ListBox,以防止 UI 冻结。所以现在它不会冻结,但也不会分组:) 任何建议表示赞赏。谢谢。

【问题讨论】:

  • 删除所有内容并使用适当的数据绑定。
  • @HighCore 我需要从后台线程向列表框添加项目
  • 不,你没有。您需要在后台线程中处理您的data,这与 UI 无关。删除所有这些并使用适当的数据绑定。
  • @HighCore 如果我从后台线程将我的项目添加到项目源,用户界面不会改变

标签: c# wpf listbox


【解决方案1】:

如果您想在后台线程中将项目添加到您的收藏中,但仍使用ItemsSource,您可以使用BindingOperations.EnableCollectionSynchronization 来执行此操作。

添加这个 using 语句:

using System.Windows.Data;

除了您的集合之外,您还需要一个用于锁定绑定引擎的对象:

ObservableCollection<MyType> Source = new ObservableCollection<MyType>();
object myLock = new object();

现在您可以在适当的地方启用同步。

BindingOperations.EnableCollectionSynchronization(Source, myLock);

您现在应该能够从后台线程更新集合,同时仍然在ListBox 上使用ItemsSource

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2010-11-29
  • 2011-04-04
相关资源
最近更新 更多