我的应用程序使用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
类。