C# 不同类型的可观察集合的集合

C# 不同类型的可观察集合的集合,c#,nested,observablecollection,covariance,C#,Nested,Observablecollection,Covariance,我正在处理一个有两个嵌套tabcontrol的问题。两者都应该绑定到一个集合。 父选项卡控件应绑定到名为devices的集合。 此设备集合应包含多个不同类型的可观察集合,这些集合应以不同的方式显示在ContentTemplate中 我试过这样的方法: public ObservableCollection<CellPhone> CellPhones { get; set; } public ObservableCollection<Watch> Watches { ge

我正在处理一个有两个嵌套tabcontrol的问题。两者都应该绑定到一个集合。 父选项卡控件应绑定到名为devices的集合。 此设备集合应包含多个不同类型的可观察集合,这些集合应以不同的方式显示在ContentTemplate中

我试过这样的方法:

public ObservableCollection<CellPhone> CellPhones { get; set; }

public ObservableCollection<Watch> Watches { get; set; }

public ObservableCollection<ObservableCollection<DeviceItem>> Devices { get; set; }
public Device CellPhones{ get; set; }

public ObservableCollection<DeviceItem> CellPhoneItems
{
    get; set;
}

public Device Watches { get; set; }

public ObservableCollection<DeviceItem> WatchItems
{
    get; set;
}

public ObservableCollection<Device> Devices
{
    get; set;
}



CellPhones = new Device("Cells");
CellPhoneItems = new ObservableCollection<DeviceItem>();
Watches = new Device("Watch");
WatchItems = new ObservableCollection<DeviceItem>();
CellPhones.Items = CellPhoneItems;
Watches.Items = WatchItems;
Devices = new ObservableCollection<Device>();
Devices.Add(CellPhones);
Devices.Add(Watches);
它说:

cannot convert from 'System.Collections.ObjectModel.ObservableCollection<CellPhone>' to 'System.Collections.ObjectModel.ObservableCollection<DeviceItem>'
无法从“System.Collections.ObjectModel.ObservableCollection”转换为“System.Collections.ObjectModel.ObservableCollection”
我确实理解这个错误消息,但我还没有找到解决方法

我读过c#中的协方差,但显然这不适用于可观测集合

关于如何解决这个问题,你有其他想法吗?

一个
列表
根本不是一个
列表
,即使
派生的
是一个
基础
。这同样适用于
可观察收集
。换句话说:如果允许,您可以同时将这两个
列表
列表
放入您的列表中。任何用户如何知道其列表中实际包含哪些项目:

var a = Devices[0]; // what type has a here? compiler can´t infer that type
首先,为什么不简单地将
手表
手机
作为
可观察的采集设备

public ObservableCollection<DeviceItem> CellPhones { get; set; }    
public ObservableCollection<DeviceItem> Watches { get; set; }    
public ObservableCollection<ObservableCollection<DeviceItem>> Devices { get; set; }
列表
根本不是
列表
,即使
派生的
基础
。这同样适用于
可观察收集
。换句话说:如果允许,您可以同时将这两个
列表
列表
放入您的列表中。任何用户如何知道其列表中实际包含哪些项目:

var a = Devices[0]; // what type has a here? compiler can´t infer that type
首先,为什么不简单地将
手表
手机
作为
可观察的采集设备

public ObservableCollection<DeviceItem> CellPhones { get; set; }    
public ObservableCollection<DeviceItem> Watches { get; set; }    
public ObservableCollection<ObservableCollection<DeviceItem>> Devices { get; set; }

我创建了一个单独的类
设备

public class Device
{

    public Device(String arg_DeviceName)
    {
        DeviceName = arg_DeviceName;
    }


    public String DeviceName { get; }

    public ObservableCollection<DeviceItem> Items
    {
        get; set;
    }
}
公共类设备
{
公用设备(字符串arg_DeviceName)
{
DeviceName=arg_DeviceName;
}
公共字符串DeviceName{get;}
公共可观测收集项目
{
获得;设置;
}
}
然后我就这样解决了:

public ObservableCollection<CellPhone> CellPhones { get; set; }

public ObservableCollection<Watch> Watches { get; set; }

public ObservableCollection<ObservableCollection<DeviceItem>> Devices { get; set; }
public Device CellPhones{ get; set; }

public ObservableCollection<DeviceItem> CellPhoneItems
{
    get; set;
}

public Device Watches { get; set; }

public ObservableCollection<DeviceItem> WatchItems
{
    get; set;
}

public ObservableCollection<Device> Devices
{
    get; set;
}



CellPhones = new Device("Cells");
CellPhoneItems = new ObservableCollection<DeviceItem>();
Watches = new Device("Watch");
WatchItems = new ObservableCollection<DeviceItem>();
CellPhones.Items = CellPhoneItems;
Watches.Items = WatchItems;
Devices = new ObservableCollection<Device>();
Devices.Add(CellPhones);
Devices.Add(Watches);
公共设备手机{get;set;}
公共可观察收集手机电话项目
{
获得;设置;
}
公用设备监视{get;set;}
公共可观测收集监视项目
{
获得;设置;
}
公共可观测采集设备
{
获得;设置;
}
手机=新设备(“手机”);
CellPhoneItems=新的ObservableCollection();
手表=新设备(“手表”);
WatchItems=新的ObservableCollection();
手机。项目=手机项目;
watchs.Items=WatchItems;
设备=新的ObservableCollection();
设备。添加(手机);
设备。添加(手表);
有了它,我可以绑定到
设备
-类的
-属性


谢谢你,布朗比尔。你睁开了我的眼睛,把我推向解决方案。

我创建了一个单独的类
设备

public class Device
{

    public Device(String arg_DeviceName)
    {
        DeviceName = arg_DeviceName;
    }


    public String DeviceName { get; }

    public ObservableCollection<DeviceItem> Items
    {
        get; set;
    }
}
公共类设备
{
公用设备(字符串arg_DeviceName)
{
DeviceName=arg_DeviceName;
}
公共字符串DeviceName{get;}
公共可观测收集项目
{
获得;设置;
}
}
然后我就这样解决了:

public ObservableCollection<CellPhone> CellPhones { get; set; }

public ObservableCollection<Watch> Watches { get; set; }

public ObservableCollection<ObservableCollection<DeviceItem>> Devices { get; set; }
public Device CellPhones{ get; set; }

public ObservableCollection<DeviceItem> CellPhoneItems
{
    get; set;
}

public Device Watches { get; set; }

public ObservableCollection<DeviceItem> WatchItems
{
    get; set;
}

public ObservableCollection<Device> Devices
{
    get; set;
}



CellPhones = new Device("Cells");
CellPhoneItems = new ObservableCollection<DeviceItem>();
Watches = new Device("Watch");
WatchItems = new ObservableCollection<DeviceItem>();
CellPhones.Items = CellPhoneItems;
Watches.Items = WatchItems;
Devices = new ObservableCollection<Device>();
Devices.Add(CellPhones);
Devices.Add(Watches);
公共设备手机{get;set;}
公共可观察收集手机电话项目
{
获得;设置;
}
公用设备监视{get;set;}
公共可观测收集监视项目
{
获得;设置;
}
公共可观测采集设备
{
获得;设置;
}
手机=新设备(“手机”);
CellPhoneItems=新的ObservableCollection();
手表=新设备(“手表”);
WatchItems=新的ObservableCollection();
手机。项目=手机项目;
watchs.Items=WatchItems;
设备=新的ObservableCollection();
设备。添加(手机);
设备。添加(手表);
有了它,我可以绑定到
设备
-类的
-属性


谢谢你,布朗比尔。你打开了我的眼睛,把我推向了解决方案。

我在Xamarin中所做的。表单使用的是接口

所以,我有一个名为
Student
的班级,还有一个名为
Teacher
的班级

我知道它们都有一些共同的属性,例如
DateOfBirth
,所以我有一个名为:
ISchoolMember
的接口,它有:

DateTime? DateOfBirth {get; set;}
如果
Student
Teacher
都实现了我的
ISchoolMember
接口,我现在可以创建一个
ISchoolMember
类型的
ObservableCollection
(或者更好的,
ObservableRangeCollection
),这样我就可以拥有
Student
Teacher
或在其中实现我的接口的任何其他类型


当我只需要学生时,我可以在LINQ查询中使用类型()的

我在Xamarin.Forms中所做的是使用接口

所以,我有一个名为
Student
的班级,还有一个名为
Teacher
的班级

我知道它们都有一些共同的属性,例如
DateOfBirth
,所以我有一个名为:
ISchoolMember
的接口,它有:

DateTime? DateOfBirth {get; set;}
如果
Student
Teacher
都实现了我的
ISchoolMember
接口,我现在可以创建一个
ISchoolMember
类型的
ObservableCollection
(或者更好的,
ObservableRangeCollection
),这样我就可以拥有
Student
Teacher
或在其中实现我的接口的任何其他类型


当我只需要学生时,我可以在LINQ查询中使用类型()的

你的个人“设备”是否总是包含两个系列,一个是手表,一个是手机?或者设备应该包含多于这两个集合实例吗?你的个人“设备”是否总是包含两个集合,一个手表,一个手机?或者设备应该包含两个以上的收集实例吗?从技术上讲是有效的。但我无法将内部集合绑定到WPF选项卡控件。我