首页 > 解决方案 > 订阅包含另一个 IObservableCollection 的 IObservableCollection (SourceList)

问题描述

我有一个代表网络上机器的对象的 SourceList,每台机器本身都有一个连接到该机器的设备的 SourceList。

我想将所有机器上的设备列表展平到另一个 SourceList 中,以便对 Machines SourceList 或 Devices SourceList 的任何更改都会反映在新列表中。

标签: c#dynamic-datareactiveui

解决方案


您可以使用TransformMany()它将您的内部列表扁平化为一个列表。请参见以下示例:

public class Device {
    public string Name {get; set;}
}

public class Machine {
    public ISourceList<Device> Devices {get;} = new SourceList<Device>();

    public string Host {get; set;}
}

public class Program
{
    public static void Main()
    {
        ReadOnlyObservableCollection<Device> list;

        ISourceList<Machine> machines = new SourceList<Machine>();
        machines
            .Connect()
            .TransformMany(it => it.Devices)
            .Bind(out list)
            .OnItemAdded(it => {
                Console.WriteLine("### Device added: "+it.Name+" ###");
            })
            .OnItemRemoved(it => {
                Console.WriteLine("### Device removed: "+it.Name+" ###");
            })
            .Subscribe();

        Machine m1 = new Machine {
            Host = "local"
        };
        machines.Add(m1);
        Device d1 = new Device {
            Name = "keyboard"
        };
        Console.WriteLine("Add d1 to m1");
        m1.Devices.Add(d1);

        Machine m2 = new Machine {
            Host = "remote"
        };
        Device d2 = new Device {
            Name = "mouse"
        };
        m2.Devices.Add(d2);
        Console.WriteLine("Add m2, which has a d2");
        machines.Add(m2);

        Device d3 = new Device {
            Name = "webcam"
        };
        Console.WriteLine("Add d3 to m1");
        m1.Devices.Add(d3);

        Console.WriteLine("Remove m1");
        machines.Remove(m1);

        Console.WriteLine("Remove m2");
        machines.Remove(m2);
    }
}

这将生成以下输出:

### Device added: keyboard ###
Add m2, which has a d2
### Device added: mouse ###
Add d3 to m1
### Device added: webcam ###
Remove m1
### Device removed: keyboard ###
### Device removed: webcam ###
Remove m2
### Device removed: mouse ###

如您所见,当您添加机器或添加设备时,列表会更新。此外,当机器被删除时,设备条目也会从列表中“清理”。


推荐阅读