Tag: observablecollection

如何在不锁定GUI的情况下将数千个项目添加到绑定集合中

我有一个设置,可能会有数千个项目(想想3000-5000)将被添加到绑定到某个可视界面的ObservableCollection 。 目前,添加它们的过程非常缓慢(大约4秒/ 1000项),当然GUI在此期间没有响应。 处理将多个项目一次移动到集合中而不用担心系统锁定的好方法是什么? 我看过DispatcherTimer但我不确定它是否会提供我需要的一切。 另一个问题 – 我是否可以采取一些措施来加速这些对象的创建,以便将它们添加到集合中并不需要很长时间? 目前我使用它们是这样的: Collection.Add(new Item())预先生成项目,在后台线程中,可能会减少添加它们所需的时间吗? 编辑:虚拟化是不可能的。 要求指定了WrapPanel外观,因此显示实际上是一个具有模板化ItemsPanel的ListBox Edit2:根据秒表,瓶颈实际上是将物品放入我的ObservableCollection 。 我会尝试更改该集合类型并自行通知,看看是否会大大加快它的速度。 编辑3:所以答案在一个地方 – 我通过创建一个inheritance自ObservableCollection的类来解决这个问题(在下面的帮助下)。 这个类做了两件事 – 公开了一次添加集合的方法,并添加了抑制CollectionChanged事件的能力。 通过这些更改,添加3000个项目所需的时间大约为.4秒(97%的改进)。 此链接详细说明了这些更改的实现。

为什么BindingList或ObservableCollection这样的类不是线程安全的?

一次又一次我发现自己必须编写BindingList和ObservableCollection的线程安全版本,因为当绑定到UI时,这些控件不能从多个线程更改。 我想要了解的是为什么会出现这种情况 – 这是设计错误还是故意这种行为?

使用ObservableCollection未正确更新ListView

我目前正在使用一个可观察的集合来存储我的ListView数据对象。 将新对象添加到集合中工作正常,listView正确更新。 但是,当我尝试更改集合中对象的某个属性时,listView将无法正确更新。 例如,我有一个可观察的集合DataCollection。 我试试 _DataCollections.ElementAt(count).Status = “Active”; 由于按下按钮,我在长时间操作之前执行此更改。 listView不会反映更改。 所以我添加myListView.Items.Refresh() 这是有效的,但是在button_click方法完成之前,listView不会刷新,这在那时是不行的。 例如: button1_Click(…) { _DataCollections.ElementAt(count).Status = “Active”; myListView.Items.Refresh(); ExecuteLongOperation(); _DataCollections.ElementAt(count).Status = “Finished”; myListView.Items.Refresh(); } 状态永远不会转到“活动”,它将在方法完成后直接进入“完成”。 我也尝试使用这样的调度程序: button1_Click(…) { this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, (NoArgDelegate)delegate { _DataCollection.ElementAt(count).Status = “Active”; myListView.Items.Refresh(); }); ExecuteLongOperation(); this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, (NoArgDelegate)delegate { _DataCollection.ElementAt(count).Status = “Finished”; myListView.Items.Refresh(); }); } 但是,这似乎也不正常。 任何提示或想法将不胜感激。

如何转换为ObservableCollection

我怎么能投 from ObservableCollection into ObservableCollection 这不适合我 (ObservableCollection)myTabItemObservableCollection

ObservableCollection和ListBoxItem DataTemplate生成问题

ObservableCollection正在发生一些奇怪的事情。 我有以下代码: private readonly ObservableCollection _display; private readonly ListBox _box; private void TransferToDisplay() { double elementsHeight = 0; _display.Clear(); for (int i = 0; i _box.ActualHeight) { _display.RemoveAt(_display.Count – 1); break; } } MessageBox.Show(elementsHeight.ToString()); } private double CalculateItemsHeight(int index) { ListBoxItem lbi = _box.ItemContainerGenerator.ContainerFromIndex(index) as ListBoxItem; return lbi != null ? lbi.ActualHeight : 0; } […]

WPF ObservableCollection vs BindingList

在我的WPF应用程序中,我有一个XamDataGrid。 网格绑定到ObservableCollection。 我需要允许用户通过网格插入新行,但事实certificate,为了使“添加新行”行可用,xamDataGrid的源需要实现IBindingList。 ObservableCollection不实现该接口。 如果我将我的源更改为BindingList,它可以正常工作。 但是,从阅读这个主题我可以理解,BindingList实际上是一个WinForms的东西,在WPF中并不完全支持。 如果我将所有ObservableCollections更改为BindingLists,我会犯错吗? 有没有人有任何其他的建议,我如何为我的xamDataGrid添加新的行function,同时将源保持为ObservableCollection? 我的理解是,有许多不同的网格需要实现IBindingList才能支持添加新的行function,但我看到的大多数解决方案只是切换到BindingList。 谢谢。

为什么ObservableCollection不支持批量更改?

ObservableCollection支持AddRange或RemoveRange等操作引起的潜在问题是什么? 由于ObservableCollection经常与WPF一起使用,因此必须有微软没有提供它们的原因。 您可以实现自己的集合来支持批量操作并实现INotifyCollectionChanged 。 如果我将这样的控件绑定到ItemsControl会发生什么? 有谁知道不支持批量更改的ItemsControls?

我可以从xaml过滤集合吗?

我有一个wpf-mvvm应用程序。 我的viewmodel中有一个可观察的集合 public ObservableCollection ImportMessageList { get; set; } “BatchImportResultMessageDto”包含两个属性.. 结果类型和消息。 结果类型可以是成功或失败。 我需要在一个列表框中显示成功..而在另一个列表框中显示失败。 我可以这样做..在viewmodel中有2个可观察的集合来保存成功/失败。 public ObservableCollection ImportFailureMessageList { get; set; } // To hold the failure messages. public ObservableCollection ImportSuccessMessageList { get; set; } // To hold the sucess messages. 但还有其他更好的方法,以便我可以过滤它(没有新的两个集合)?

将ObservableCollection绑定到ListView

我在使数据正确绑定方面遇到了很大的麻烦。 我已经从有类似问题的人那里阅读了大部分post,但由于某些原因我无法点击它。 我的表的XML是: … 在我的代码中,我有: public ObservableCollection _DocumentList = new ObservableCollection(); … public ObservableCollection DocumentList{ get { return _DocumentList; } } … public class Document { public string Description { get; set; } public string DateFiled { get; set; } public string UserFiledName { get; set; } public string Pages { get; set; } public […]

ObservableCollection:使用多个新项调用OnCollectionChanged

请注意,我正在尝试使用NotifyCollectionChangedAction.Add操作而不是.Reset。 后者确实有效,但对于大型集合来说效率不高。 所以我inheritance了ObservableCollection: public class SuspendableObservableCollection : ObservableCollection 出于某种原因,这段代码: private List _cachedItems; … public void FlushCache() { if (_cachedItems.Count > 0) { foreach (var item in _cachedItems) Items.Add(item); OnCollectionChanged(new NotifyCollectionChangedEventArgs( NotifyCollectionChangedAction.Add, (IList)_cachedItems)); } } 抛出一个集合添加事件是指不属于集合的项目 这似乎是BCL的一个错误? 我可以在调用OnCollectionChanged之前逐步查看将新项添加到this.Items 哇 刚刚发现了一个惊人的发现。 这些方法都不适合我(flush,addrange),因为只有当这个集合绑定到我的Listview时才会触发错误! TestObservableCollection testCollection = new TestObservableCollection(); List testTrades = new List(); for (int i = 0; […]