是否有一种更简单的方法将多个可观察集合组合成一个可观察集合?

本文关键字:集合 观察 组合 一个 方法 一种 更简单 是否 | 更新日期: 2023-09-27 18:11:58

我的应用程序使用CSLA框架和MVVM Light。对于不熟悉它的人,CSLA允许我构建对象图并提供可观察的绑定列表,例如:

public class RootObject : BusinessBase<Customer>
{
    public FriendList Friends { get { ... } set { ... } }
}
public class FriendList : BusinessListBase<FriendsList, Friend> { }
public class Friend : BusinessBase<Friend>
{
    public AnnouncementList Announcements { get { ... } set { ... } }
}

我的问题是我想把所有的公告聚集到一个单一的ObservableCollection<Announcement>为我的视图模型。

public class MainViewModel
{
    private RootObject _graph;
    public MainViewModel(int userId)
    {
        _graph = GetObjectGraph(userId);
        var announcements = _graph.Friends.SelectMany(x => x.Announcements);
        Announcements = new ObservableCollection<Announcement>(announcements);
        // Some way of synchronizing every new collection here!
    }
    public ObservableCollection<Announcement> Announcements { get; private set; }
}

我确实有一些代码,试图订阅FriendList的collectionchanged事件,然后订阅每个新朋友的collectionchanged事件,并从老朋友取消订阅等等,但它变得非常复杂和非常快。

我也试着看看响应式扩展,但我不知道如何让它删除项目作为朋友被删除或通知被删除。

我也遇到了一些名为ReactiveUI的MVVM框架,但我不想把MVVMLight中的所有东西都重做到ReactiveUI中。

我真的不确定是否有更好的方法,也许有一种方法可以让Rx在没有整个框架的情况下工作,只是为了这种情况?我只是不想回到选项一,用嵌套的集合更改事件订阅来管理一堆集合更改事件!

是否有一种更简单的方法将多个可观察集合组合成一个可观察集合?

我也遇到了一些名为ReactiveUI的MVVM框架,但我不想把MVVMLight中的所有东西都重做到ReactiveUI中。

你不需要重写任何在你的MVVM Light项目中使用ReactiveUI,一切都将与你现有的代码一起工作。

话虽这么说,虽然RxUI的派生集合支持多种转换列表的操作,但SelectMany并不是其中之一(也就是说,将列表的基列表转换为扁平列表)。您必须自己编写这部分内容,尽管Rx和ReactiveList将使任务比手工完成要容易得多。

我知道这个问题很老了,但在我看来,将多个ObservableCollection绑定到一个ObservableCollection是你正在寻找的答案。

基本上,使用允许将多个集合视为单个集合的CompositeCollection类。