我们试图将两个子集合的内容公开为一个额外的、包罗万象的IEnumerable
属性。人们建议使用CompositeCollection
这种情况,但有两个问题:
- 似乎没有只读变体,但即使有......
- 由于它依赖于模型层,它并不真正适合模型层
System.Windows.Data
相反,我的想法是使用自定义IEnumerable
实现。这是一个虚构的例子,展示了这个概念......
public class Pets : INotifyPropertyChanged {
public ObservableCollection<string> Dogs { get; } = new ObservableCollection<string>();
public ObservableCollection<string> Cats { get; } = new ObservableCollection<string>();
public IEnumerable All{
get {
// Cats go first because dogs always follow! ;)
foreach(var cat in Cats)
yield return cat;
foreach(var dog in Dogs)
yield return dog;
}
}
}
虽然这确实根据需要枚举了所有孩子,但我看到的问题是它All
没有意识到,也没有通知更改Dogs
或Cats
因为它没有实现INotifyCollectionChanged
甚至INotifyPropertyChanged
*,这让我想知道这是否是正确的方法首先去。
* 这实际上有点容易“坚持”。只需订阅
INotifyCollectionChanged
事件Dogs
并在处理任何这些事件时Cats
发出更改通知。All
但这是一个全有或全无的事情,我不确定这是正确的方法。
我的下一个想法是推出我自己的轻量版 CompositeCollection,但我不禁认为这是使用 18 轮车去商店买牛奶。但它似乎确实有最大的希望。
有没有其他方法可以使自定义 IEnumerable 正确处理来自内部集合的通知?(我也不反对一开始就放弃将其作为model
属性,而是在 UI 层中进行组合。我是否这样做取决于我在这里得到的答案。)