将 IList<T> 附加到 ObservableCollection<T>

Attaching an IList<T> to an ObservableCollection<T>

Collection<T>IList<T> 的包装器。 列表可以附加在构造函数中。据我所知,没有提供其他方法。

尽管 ObservableCollection<T> 派生自 Collection<T>,但您不能附加 IList<T>。实例可以从 List<T> 而不是 IList<T> 构造,并且 列表是 copied.

public 源代码似乎证实了上述内容。

  1. 这种不一致是错误吗?
  2. 我如何附加我自己的IList<T>实现到ObservableCollection<T>?该解决方案必须使用标准 ObservableCollection<T>.

我是 c# 新手。谢谢。

这看起来绝对不像是错误,我也不知道为什么会出现不一致。

ObservableCollection 的功能可以防止这种情况发生。该功能保证您可以收到 ObservableCollection 的任何更改通知。为了能够做到这一点,它需要对保存其条目的底层数据结构进行完全控制更改。

如果只是 "attach" 和现有列表,则 ObservableCollection 没有句柄以通知更改。让我们想象以下场景:

IList<string> someStringList = new List<string>
{
    "Entry1",
    "Entry2",
    "Entry3"
};

var observableCollection = new ObservableCollection<string>(someStringList);

observableCollection.CollectionChanged += (sender, eventArgs) => Console.WriteLine("Something changed!");

someStringList.Add("This addition cannot be seen by the ObservableCollection!");

这是一致的,ObservableCollection 已经创建了一个副本,所以如果我们查看它,它不会包含 "This addition cannot be seen by the ObservableCollection!" 条目。

现在如果你想要的东西可以工作(所以 ObservableCollection 必须是原始列表 "attached" 而不是复制),我们会有一些奇怪的东西。 CollectionChanged 事件不会被触发(添加没有通过 ObservableCollection 的添加)但是如果你检查 observableCollection 它会包含添加的条目(因为它是添加到 "attached" 列表),这会使整个事情变得不一致。

至少这是我对为什么这可能是一个设计选择而不是一个错误的看法。

希望对您有所帮助!