不同类型的ObservableCollections的集合

时间:2018-11-07 11:44:33

标签: c# nested observablecollection covariance

我正在解决一个有两个嵌套的TabControl的问题。两者都应绑定到集合。 父选项卡控件应绑定到称为设备的集合。 该设备集合应包含多个不同类型的ObservableCollection,应在ContentTemplate中以不同的方式显示。

我尝试过这样的事情:

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

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

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

WatchCellPhone继承自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。

您对如何解决此问题还有其他想法吗?

3 个答案:

答案 0 :(得分:2)

即使List<Derived>List<Base>Derived也不是BaseObservableCollection也是如此。换句话说:如果允许,您可以同时将两者List<CellPhone>List<Watch>都放入列表中。任何用户如何知道他的列表中实际有哪些物品:

var a = Devices[0]; // what type has a here? compiler can´t infer that type

为什么不首先简单地将WatchesCellPhones设为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;}

如果StudentTeacher都实现了我的ISchoolMember接口,那么我现在可以创建类型{{的ObservableCollection(甚至更好的ObservableRangeCollection) 1}},因此我可以使用ISchoolMemberStudent或任何其他实现接口的类型。

当我仅需要学生时,我可以在LINQ查询中使用Teacher