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