我正在解决一个有两个嵌套的TabControl的问题。两者都应绑定到集合。 父选项卡控件应绑定到称为设备的集合。 该设备集合应包含多个不同类型的ObservableCollection,应在ContentTemplate中以不同的方式显示。
我尝试过这样的事情:
public ObservableCollection<CellPhone> CellPhones { get; set; }
public ObservableCollection<Watch> Watches { get; set; }
public ObservableCollection<ObservableCollection<DeviceItem>> Devices { get; set; }
Watch
和CellPhone
继承自DeviceItem
。
我尝试了以下操作:
CellPhones = new ObservableCollection<CellPhone>();
Watches = new ObservableCollection<Watch>();
Devices = new ObservableCollection<ObservableCollection<DeviceItem>>();
Devices.Add(CellPhones); // it fails here...
它说:
cannot convert from 'System.Collections.ObjectModel.ObservableCollection<CellPhone>' to 'System.Collections.ObjectModel.ObservableCollection<DeviceItem>'
我确实理解了此错误消息,但是我没有找到解决方法。
我了解了c#中的协方差,但是显然这不适用于ObservableCollections。
您对如何解决此问题还有其他想法吗?
答案 0 :(得分:2)
即使List<Derived>
是List<Base>
,Derived
也不是Base
。 ObservableCollection
也是如此。换句话说:如果允许,您可以同时将两者,List<CellPhone>
和List<Watch>
都放入列表中。任何用户如何知道他的列表中实际有哪些物品:
var a = Devices[0]; // what type has a here? compiler can´t infer that type
为什么不首先简单地将Watches
和CellPhones
设为ObservableCollection<DeviceItem>
:
public ObservableCollection<DeviceItem> CellPhones { get; set; }
public ObservableCollection<DeviceItem> Watches { get; set; }
public ObservableCollection<ObservableCollection<DeviceItem>> Devices { get; set; }
现在您可以轻松地做到这一点:
Devices.Add(CellPhones);
Devices.Add(Watches);
答案 1 :(得分:0)
我创建了一个单独的类new java.text.DecimalFormat("#.00").format(0)
new java.text.DecimalFormat("#.00").format(0.00)
new java.text.DecimalFormat("#.00").format(0.10)
Device
然后我像这样解决它:
public class Device
{
public Device(String arg_DeviceName)
{
DeviceName = arg_DeviceName;
}
public String DeviceName { get; }
public ObservableCollection<DeviceItem> Items
{
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);
类的Items
属性。
谢谢HimBromBeere。您睁开眼睛,将我推向解决方案。
答案 2 :(得分:0)
我在Xamarin.Forms中正在使用接口。
因此,成像我有一个名为Student
的班级,还有一个名为Teacher
的班级。
我知道他们两个都有共同的属性,例如DateOfBirth
,所以我有一个名为:ISchoolMember
的接口,它具有:
DateTime? DateOfBirth {get; set;}
如果Student
和Teacher
都实现了我的ISchoolMember
接口,那么我现在可以创建类型{{的ObservableCollection
(甚至更好的ObservableRangeCollection
) 1}},因此我可以使用ISchoolMember
,Student
或任何其他实现接口的类型。
当我仅需要学生时,我可以在LINQ查询中使用Teacher
。