问题标签 [observablecollection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
8773 浏览

wpf - 无法在多线程中操作 ObservableCollection

ObservableCollection 似乎只支持从 UI 线程添加、删除、清除操作,如果它由 NO UI 线程操作,它会抛出 Not Support Exception。我试图覆盖 ObservableCollection 的方法,不幸的是,我遇到了很多问题。任何人都可以为我提供一个可以由多线程操作的 ObservableCollection 示例吗?非常感谢!

0 投票
2 回答
1325 浏览

.net - 使用 ObservableCollection带后台线程

微软似乎对 ObservableCollection 有一个好主意。它们非常适合绑定,并且在 UI 上非常快。

然而,每次你想要调整它时都需要一个上下文切换到 Dispatcher Thread 似乎有点多。有谁知道使用它们的最佳实践?是不是简单的在业务层填充一个ICollection作为消息对象,然后在UI层创建ObservableCollection?然后如何处理 UI 上的集合更新?

0 投票
20 回答
48953 浏览

wpf - 清除 ObservableCollection 时,e.OldItems 中没有项目

我这里有一些东西真的让我措手不及。

我有一个装满项目的 T 的 ObservableCollection。我还有一个附加到 CollectionChanged 事件的事件处理程序。

当您清除集合时,它会导致一个 CollectionChanged 事件,其中 e.Action 设置为 NotifyCollectionChangedAction.Reset。好吧,这很正常。但奇怪的是,e.OldItems 或 e.NewItems 中都没有任何内容。我希望 e.OldItems 会填充从集合中删除的所有项目。

有没有其他人看过这个?如果是这样,他们是如何绕过它的?

一些背景:我正在使用 CollectionChanged 事件来附加和分离另一个事件,因此如果我没有在 e.OldItems 中获得任何项目......我将无法从该事件中分离。


澄清: 我知道文档并没有直接说明它必须以这种方式运行。但是对于其他每一个动作,它都会通知我它做了什么。所以,我的假设是它会告诉我......在清除/重置的情况下也是如此。


如果您想自己重现它,下面是示例代码。首先关闭xaml:

接下来是后面的代码:

0 投票
8 回答
60439 浏览

wpf - 强制数据绑定 WPF ListBox 更新的更好方法?

我有绑定到 ObservableCollection 的 WPF ListBox,当集合更改时,所有项目都会更新它们的位置。

新位置存储在集合中,但 UI 不会更新。所以我添加了以下内容:

通过将 ItemsSource 设置为 null 然后再次绑定,UI 被更新,

但这可能是非常糟糕的编码:p

建议?

0 投票
1 回答
5104 浏览

wpf - 如何对 ObservableCollection 进行分页?

我有一个 ListBox,里面有太多的项目,而且 UI 越来越慢(虚拟化等)。所以我在考虑只显示前 20 个项目并允许用户浏览结果集(即 ObservableCollection)。

有人知道 ObservableCollection 是否存在分页机制吗?以前有人做过吗?

谢谢!

0 投票
2 回答
5195 浏览

wpf - XAML - 集合初始值设定项中的静态资源

我想添加一个已在 XAML 中实例化一次的模型对象,并将其添加到两个不同的集合(在 xaml 中)。

以下代码在 Blend 的设计时呈现良好,但在运行时出现以下错误:

对于“WpfBlog.Models.Tag”类型的“Post1”
对象,无法转换为“System.Collections.ObjectModel.ObservableCollection`1[WpfBlog.Models.Tag]”类型。标记文件 'WpfBlog;component/Admin.xaml' 行 XX 位置 YY 中的对象 'WpfBlog.Admin' 出错。

如果我注释掉“Post1”,我将在“Post2”上收到此错误,
无法将元素添加到属性“标签”,因为如果该属性使用显式集合标签,则它只能有一个子元素。标记文件“WpfBlog;component/Admin.xaml”行 AA 位置 BB 中的对象“System.Windows.StaticResourceExtension”出错。

以下代码编译并运行良好,但创建了两个名为“TDD”的标签,因此如果我尝试重命名该标签,我必须为所有帖子重命名,而不仅仅是一个 Tag 对象。

有任何想法吗?如果 Blend 没有正确渲染它,我可以忽略它并解决它,但它确实如此!

0 投票
1 回答
880 浏览

wpf - 持久化数据绑定 WPF ObservableCollection 的首选方法?

我有一个继承自 ObservableCollection(Of MyObject) 的类,并且 MyObject 类按应有的方式处理 INotifyPropertyChanged。当用户通过绑定控件更新此数据时,集合将按预期更改。

我在表单上有一个“保存”按钮,旨在通过在每个项目上调用 MyObject.Save 将此集合作为 XML 保存到磁盘。这个逻辑是我写的。

我的问题是,这是持久化对象的首选方式,还是我缺少一个属性或接口来告诉 WPF 数据绑定/.Net 框架使用哪种方法来保存/加载数据?

我问是因为我看到的 WPF 示例省略了真实数据的保存和加载,所以我不确定。

0 投票
3 回答
17355 浏览

winforms - ObservableCollection(Of T) vs BindingList(Of T)?

在过去的两年里,我开发了一些基于数据的 Winforms 应用程序,一切正常。此应用程序建立在层(数据访问、业务逻辑和 UI)之上。对于业务逻辑,我的所有对象都继承自一个名为 BaseEntity 的基类,其定义如下(有一些自定义对象和接口,结合框架元素):

在同一个核心库中,我有一个通用基础集合 BaseEntityCollection。这些集合允许我为每个对象定义他相关的强类型集合,这在基于数据的应用程序中非常有趣。这是它的基本定义:

如您所见,我使用了 Winforms 中正确数据绑定所需的所有内容:

  • 对象的 INotifyPropertyChanged、INotifyPropertyChanging、IEditableObject。
  • 我的收藏基于 BindingList(Of T) 的收藏。

我对新技术也很感兴趣,所以我最近看了一些关于 WPF 的网络广播。在这些网络广播中,它们用作收集和数据绑定支持 ObservableCollection(Of T) 的基类。

我正在考虑将我的一些应用程序从 Winforms 迁移到 UI 层的 WPF。

我的问题是,对于我的业务逻辑,是更好地保留基于 BindingList(Of T) 的集合还是应该更改我的基本集合类以使其继承自 ObservableCollection(Of T)。我想为我的所有项目保留一个独特的基础集合,它也可以在 Winforms 应用程序、WPF 应用程序或 ASP.NET 中使用。我还在我的项目中使用 Linq to Objects,所以我的项目仅基于框架 2.0 并不受限制。

0 投票
2 回答
640 浏览

wpf - 依赖属性奇异性

我已经使用 and 组合了一个 WPF 应用程序ObservableCollectionDependency Properties这很酷,因为我只需向其中添加一个项目ObservableCollection,它就会自动显示,例如,我将集合中的对象显示为包装面板中屏幕上的框,每个框都显示其Title.

所以我想让每个项目不仅显示它的Title加前缀或后缀,而且似乎甚至没有使用依赖对象属性。我可以在它上面设置一个断点,它永远不会到达。

谁能告诉我为什么,如果我将文本添加到传出属性中,该文本永远不会被看到?我已经读过该值实际上“不是存储在对象中而是存储在 WPF 中”,但我不明白这意味着什么。

为什么依赖对象永远不会输出此文本的文本?

0 投票
4 回答
10231 浏览

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

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