1

我们试图将两个子集合的内容公开为一个额外的、包罗万象的IEnumerable属性。人们建议使用CompositeCollection这种情况,但有两个问题:

  1. 似乎没有只读变体,但即使有......
  2. 由于它依赖于模型层,它并不真正适合模型层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没有意识到,也没有通知更改DogsCats因为它没有实现INotifyCollectionChanged甚至INotifyPropertyChanged*,这让我想知道这是否是正确的方法首先去。

* 这实际上有点容易“坚持”。只需订阅INotifyCollectionChanged事件Dogs并在处理任何这些事件时Cats发出更改通知。All但这是一个全有或全无的事情,我不确定这是正确的方法。

我的下一个想法是推出我自己的轻量版 CompositeCollection,但我不禁认为这是使用 18 轮车去商店买牛奶。但它似乎确实有最大的希望。

有没有其他方法可以使自定义 IEnumerable 正确处理来自内部集合的通知?(我也不反对一开始就放弃将其作为model属性,而是在 UI 层中进行组合。我是否这样做取决于我在这里得到的答案。)

4

0 回答 0