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

时间:2014-07-08 03:24:34

标签: c# linq mvvm observablecollection system.reactive

我在我的应用程序中使用CSLA Framework和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事件并取消订阅旧朋友等等,但是它非常复杂得极其快。

我也尝试过查看Reactive Extensions,但我不知道如何移除项目,因为移除了朋友或删除了通知。

我还遇到了一些名为ReactiveUI的MVVM框架,但我不想重做MVVMLight和ReactiveUI中的所有内容。

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

2 个答案:

答案 0 :(得分:1)

  

我还遇到了一些名为ReactiveUI的MVVM框架,但我不想重做MVVMLight和ReactiveUI中的所有内容。

您不必重写任何以在MVVM Light项目中使用ReactiveUI,一切都将与现有代码一起使用。

话虽如此,虽然RxUI的Derived Collections支持多个转换列表的操作,但SelectMany不是其中之一(即获取列表的基本列表并将其转换为扁平列表)。您必须自己编写这个位,尽管Rx和ReactiveList会使这个任务 更容易实现,而不是手工完成。

答案 1 :(得分:1)

我知道这个问题已经过时了,但在我看来,Binding multiple ObservableCollections to One ObservableCollection是您正在寻找的答案。

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