c# - 订阅包含另一个 IObservableCollection 的 IObservableCollection (SourceList)
问题描述
我有一个代表网络上机器的对象的 SourceList,每台机器本身都有一个连接到该机器的设备的 SourceList。
我想将所有机器上的设备列表展平到另一个 SourceList 中,以便对 Machines SourceList 或 Devices SourceList 的任何更改都会反映在新列表中。
解决方案
您可以使用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 ###
如您所见,当您添加机器或添加设备时,列表会更新。此外,当机器被删除时,设备条目也会从列表中“清理”。
推荐阅读
- python - 在 python 中使用正则表达式查找特定的数字模式
- python - 尝试使用文件操作时出现 NameError
- sas - 如何制作良好的可重现 SAS 示例?
- node.js - Google Android Publisher API inappproducts.insert 权限错误
- python - 显示框的属性
- java - JPARepository 未保存到数据库
- python - 用 pandas 过滤 CSV
- zsh - 向 .zshrc 添加函数会更改命令
- swift - 在尝试子类化 uibezierPath 时出现编码错误中的参数缺少参数
- react-native-sensors - react-native-sensors 错误:传感器的本机模块不可用。react-native 链接是否运行成功?