Коллекция ObservableCollections разных типов - PullRequest
0 голосов
/ 07 ноября 2018

Я работаю над проблемой, когда у меня есть два вложенных TabControls. Оба должны связываться с коллекцией. Элемент управления родительской вкладки должен связываться с коллекцией, называемой устройствами. Эта коллекция устройств должна содержать несколько ObservableCollections разных типов, которые должны по-разному отображаться в 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.

У вас есть другая идея, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Я создал отдельный класс 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 -свойством Device -класса.

Спасибо, БромБир. Вы открыли мне глаза и подтолкнули меня к решению.

0 голосов
/ 07 ноября 2018

A 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...