问题标签 [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 投票
1 回答
1005 浏览

wpf - 如何将 TabControl 绑定到 XAML 中的 ObservableCollection

我的代码隐藏类中有以下代码行。

我想将此移至 XAML 文件。

简单来说,

  • 有一个 MainWindow 类表示主窗口。
  • 主窗口上有一个 TabControl。
  • 有 2 个视图模型,称为 MainWindowViewModel 和 TabItemViewModel。
  • MainWindowViewModel 具有 TabItemViewModel 类的可观察集合。
  • MainWindowViewModel 是主窗口的视图模型类。
  • TabItemViewModel 是主窗口上 TabControl 中每个单独选项卡的视图模型类。
  • MainWindow 类的 DataContext 属性设置为 MainWindowViewModel 类的实例,在 XAML 中实例化。

我想要做的是将 MainWindowViewModel 类的 TabItemViewModels 属性绑定到 TabControl 的 ItemSources 属性。

我不仅要寻找一行代码,还要寻找一些关于 Bindings 语法的指针,因为我完全迷失了它,而且它似乎对使用 XAML 非常重要。

0 投票
5 回答
18731 浏览

c# - 如何创建只读的 ObservableCollection 属性?

我想在包含对象列表(来自数据库)的视图模型上公开一个属性。

我需要这个集合是只读的。也就是说,我想阻止添加/删除等。但允许 foreach 和索引器工作。我的意图是声明一个包含可编辑集合的私有字段并使用只读公共属性引用它。如下

但是,该语法只是防止更改对集合的引用。它不会阻止添加/删除等。

实现这一目标的正确方法是什么?

0 投票
1 回答
1525 浏览

c# - 可观察集合不更新列表框

我已经将 a 设置ItemsSourceListBox一个ObservableCollection<Employee>集合,并且我的Employee类实现了INotifyPropertyChanged.

在 上Employee,我绑定了几个属性,其中一个是一个Color属性,并且我确保它在PropertyChanged事件发生更改时调用它。我还检查了PropertyChanged调用调用的调试器。

但是,当数据绑定时,绑定中的永远Background不会更新,这非常令人沮丧。ListBoxItemListBox

将其设置ItemsSource为 null,并在工作后将其重置,但这不是我们使用观察者模式的方式。

使用的 XAML:

响应第一个回复的更多代码:

0 投票
3 回答
1383 浏览

wcf - ObservableCollection 使用 WCF 传输后变成一个数组

我有一个名为“Board”的类,它的一个属性是 ObservableCollection。当我通过 WCF(从服务器到客户端)发送 ObservableCollection 时,从我的代理端调用它,它变成了一个数组,这对我没有好处。

我可以在发送后保留 ObservableCollection,还是我必须踢 Array 直到它再次变成 ObservableCollection?

0 投票
4 回答
961 浏览

c# - 征求意见:拦截对列表/集合的更改

尽管BindingList<T>ObservableCollection<T>提供了检测列表更改的机制,但它们不支持在更改发生之前检测/拦截更改的机制。

我正在编写几个接口来支持这一点,但我想征求您的意见。

选项 1:列出每种操作的引发事件

在这里,消费者可能会编写如下代码:

选项 2:列表引发单个事件,操作由事件参数确定

在这里,消费者可能会编写如下代码:

背景:我正在编写一组代表 DDD 核心组件的通用接口/类,并且我正在提供源代码(因此需要创建友好的接口)。

这个问题是关于使接口尽可能内聚,以便消费者可以在不丢失核心语义的情况下派生和实现自己的集合。

PS:请不要为每个列表建议使用AddXYZ()RemoveXYZ()方法,因为我已经打折了这个想法。

PPS:我必须包括使用 .NET 2.0 的开发人员 :)


相关问题

0 投票
1 回答
14483 浏览

winforms - 可观察集合在 Winforms 和可能的替代方案中

Winforms .net 3.5 应用程序。在我的应用程序中,我有一个看起来像这样的通用类:

当我想实现某种过滤器功能时,我会在所有对话框中使用它。List<FilterItem>所以我用构造函数中传递的预填充来调用对话框表单。现在,当对话框加载时,它会遍历每个列表项并添加:

  1. 一个复选框
  2. 组合框
  3. 一个文本框

到 TableLayoutPanel 中的每一行。Checkbox 从...获取其文本属性FilterProperty及其 Checked 状态FilterPropertyChecked...Combobox 从...获取其绑定,FilterOperator而 Textbox 从...获取其文本值FilterValue

注意我只说得到。我想做的是在它们的属性必须更改的控件时自动更新这些属性。我听说过,ObservableCollection<T>但在添加命名空间后,我似乎无法在 Winforms 中“访问”它System.Collections.ObjectModel

实现这一目标的最佳方法是什么。BindingList 与 INotifyPropertyChanged?? 我不是后者的专家,并且非常感谢一些指示 - 如果这是我应该走的路。

感谢你!

编辑:

好的,让我发布一些代码来展示我认为我应该做什么:)。我知道我需要INotifyPropertyChanged在我的 FilterItem 类上实现,所以(例如,仅用于 FilterValue 部分):

现在它应该全部放在我的 Form_Load 中(这仅适用于文本框部分,我省略了 Checbox 和 ComboBox),如下所示:

文本框的数据绑定 DataSource 是 FilterItem 的“项目”。但是现在我的 Visual Studio IDE 似乎有问题,所以不能尝试这个,但是当我启动并运行它时会。我现在想知道的是:此设置是否会成功地帮助我的个人FilterItem在他们分配的 Control 各自的属性发生变化时自动更新?

0 投票
1 回答
2076 浏览

silverlight - 在 DataGrid 中包装 ObservableCollection 时的 PagedCollectionView 在不存在数据时清除列标题

我正在使用 PagedCollectionView 进行分组。我有一个 DataGrid 和一个带有搜索按钮的文本框。网格的 ItemSource 是我的 PagedCollectionView,而 PagedCollectionView 包装了一个 ObservableCollection,因为网格中的项目可以通过后台进程更新其绑定对象。当您单击搜索时,我首先通过 ObservableCollection 清除,然后使用数据库中的数据加载它。当我对我的集合调用 clear 时,DataGrid 上的内容消失了,包括列。当项目添加到我的收藏时,它们会重新出现。我真的很希望这些列和它们的标题保留下来,因为当它们消失时会很不和谐,更不用说排序顺序等丢失了。我相信这些项目会立即消失,因为它是一个 ObservableCollection,但我需要这样才能通过上述后台进程更新行。如果我将 PagedCollectionView 作为包装器删除,并且只是将 DataGrid 的 ItemSource 设置为 ObservableCollection,则不会发生这种行为,即使清除了集合,我的列和标题仍然存在,并且我的行会通过后台进程即时更新。有没有其他人观察到这种行为?有谁知道任何解决方法?还是我只是做错了什么?有没有其他人观察到这种行为?有谁知道任何解决方法?还是我只是做错了什么?有没有其他人观察到这种行为?有谁知道任何解决方法?还是我只是做错了什么?

0 投票
3 回答
9064 浏览

c# - 通过 WPF 使用带有 ObservableCollection 的 HashSet

我正在使用 ListBox 来维护 WPF 应用程序中的项目列表。ListBox 数据源是包装在 ObservableCollection 中的 HashSet。即,我有以下代码:

... 其中 shackListing 是一个 ListBox 控件,而 shackSet 在一个 ICollection 中。但是,每当我在添加第一个项目后向 shackSet 添加任何内容时,我都会在 ListBox 中看到多个项目。即就像新添加的项目被添加到列表中,无论它们是否被添加到集合中。当我查看 ICollection#Add 的签名时:

...和 ​​HashSet#Add :

...这使我相信存在一个影响包装的 HashSet 的错误,其中新添加的项目被添加到 ListBox 中,因为 ObservableCollection 无法判断对象是否实际添加到底层集合中,因为 ICollection 的返回类型#添加无效。其他人可以证实这一点吗?

0 投票
1 回答
3017 浏览

c# - ObservableCollection 包装器强制转换为基本类型

我有一个名为 的类Client,它是 的子类Configurable

我有一个ObservableCollection<Client>我需要将其视为ObservableCollection<Configurable>. 这将允许我从一些通用布局生成代码中将数据绑定到列表。它还必须允许我清除列表,并将项目添加到列表中。当然,在将项目添加到列表时,它必须进行运行时类型检查,以验证Configurable要添加的一般项目 ( ) 是否属于适当的类型 ( Client)。

我正在想象一个名为ObservableSurrogateCollection<T>. T是一般类 ( Configurable)。您可以通过将 传递给它来构造它ObservableCollection<T2>,其中T2是 的子类T。您可以对其进行数据绑定,并且包装列表上的所有集合更改事件都会正确路由(双向)。

这存在吗?这不是我应该做的事情吗?我想我读到 .NET 4.0 会在语言级别支持这样的功能?

我看过这些选项:

  • ReadOnlyObservableCollection<T>. 这真的很接近。但是,因为它是只读的,所以我无法添加或清除项目。
  • 一个非通用ObservableCollection. 我似乎找不到这个,如果它存在的话。

提前感谢您的帮助!

0 投票
1 回答
1791 浏览

wpf - 处理 ObservableCollection CollectionChanged 事件

我在 Silverlight 工具包中看到过类似以下的代码,但无法理解如何安全地执行此操作:

如果您从说索引 5 中删除一个项目,这不会将_items索引 5 之后集合中每个项目的当前索引更改为比以前少一个吗?那么,像这段代码那样使用它们的“旧”索引持续删除项目是安全的吗?

我真的很想了解为什么会这样。

有任何想法吗?