C # класс, который имеет имя и коллекцию любого типа объекта - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь создать список меню, которые пользователь может выбрать из TreeView.После выбора меню из дерева я хочу показать элементы в этом меню в отдельной части окна.Моя первая мысль о том, как это сделать, - создать класс, как показано ниже:

public class SettingsMenu
{
    public string Name { set; get; }
    public ObservableCollection<object> Items { set; get; }

    public SettingsMenu()
    {
        Name = "";
        Items = new ObservableCollection<object>();
    }

    public SettingsMenu(string _name, ObservableCollection<object> _items)
    {
        Name = _name;
        Items = _items;
    }

    public void AddItem(object _item)
    {
        Items.Add(_item);
    }
}

Где «Предметы» - это элементы в меню.Затем я создам новый экземпляр этого класса для каждого меню в моей системе и инициализирую его именем и набором элементов ObservableCollection.

Однако элементы могут быть нескольких пользовательских типов.Для базовой демонстрации моей проблемы это будет эквивалентно:

    MenuInts = new SettingsMenu("Menu1", new ObservableCollection<int>());
    MenuStrings = new SettingsMenu("Menu2", new ObservableCollection<string>());
    MenuBools = new SettingsMenu("Menu3", new ObservableCollection<bool>());

Но я получаю ошибку компилятора:

Cannot convert from
'System.Collections.ObjectModel.ObservableCollection<type>' to
'System.Collections.ObjectModel.ObservableCollection<object>'

Я хотел бы использовать один класс "Меню"так что я могу использовать его согласованно для отображения и взаимодействия в пользовательском интерфейсе.Есть ли способ иметь один мастер-класс, который может содержать коллекцию ObservableCollection любого типа?

1 Ответ

0 голосов
/ 16 мая 2018

Как уже отмечалось в комментарии Эда Планкетта, вы можете абстрагировать необходимую вам функциональность для общего интерфейса или базового класса:

public interface ISettingsMenu
{
    string Name { set; get; }

    IEnumerable<object> Items { get; }

   void AddItem(object item);
}


public class SettingsMenu<T> : ISettingsMenu
{
    public string Name { set; get; }

    public ObservableCollection<T> Items { set; get; }

    IEnumerable<object>  ISettingsMenu.Items
    {
        get { return Items.Cast<object>(); }
    }

    public void AddItem(object item)
    {
        throw new System.NotImplementedException();
    }

    public SettingsMenu()
    {
        Name = "";
        Items = new ObservableCollection<T>();
    }

    public SettingsMenu(string _name, ObservableCollection<T> _items)
    {
        Name = _name;
        Items = _items;
    }

    public void AddItem(T _item)
    {
        Items.Add(_item);
    }
}

В этом примере элементы представлены как IEnumerable - если вам нужен доступObservableCollection для привязки к его событиям может потребоваться метод init для интерфейса, который принимает элемент управления для привязки в качестве параметра.

...