Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有名称和任何对象类型集合的C类_C#_Wpf_Generics_Observablecollection - Fatal编程技术网

C# 具有名称和任何对象类型集合的C类

C# 具有名称和任何对象类型集合的C类,c#,wpf,generics,observablecollection,C#,Wpf,Generics,Observablecollection,我试图创建一个菜单列表,用户可以从树视图中选择。从树中选择菜单后,我想在窗口的单独部分显示该菜单中的项目。我的第一个想法是创建一个如下所示的类: public class SettingsMenu { public string Name { set; get; } public ObservableCollection<object> Items { set; get; } public SettingsMenu() { Name

我试图创建一个菜单列表,用户可以从树视图中选择。从树中选择菜单后,我想在窗口的单独部分显示该菜单中的项目。我的第一个想法是创建一个如下所示的类:

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);
    }
}
其中项目是菜单中的项目。然后,我将为系统中的每个菜单创建该类的新实例,并使用名称和可观察项集合对其进行初始化

但是,项目可以是几种自定义类型。对于我的问题的基本演示,它相当于:

    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>'

我想使用一个菜单类,这样我就可以在UI中以一致的方式使用它进行显示和交互。有没有办法让一个主类可以包含任何类型的ObservableCollection?

正如Ed Plunkett的评论中所指出的,您可以将需要的功能抽象到一个公共接口或基类:

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方法。

int的集合不是object的集合。您不能向其添加任意对象,只能添加int。因此类型系统不会让您以这种方式射击自己的脚。对所有设置都使用ObservableCollection,或者将SettingsMenu设置为通用设置。您可能需要编写一个非泛型基或显式实现的非泛型接口和泛型子类。谢谢您的回答。我相信这会让我找到我需要的东西。我以前从未使用过接口,虽然我使用过抽象类,现在已经理解了它们的相似性/差异性。我需要学习向接口添加什么,以便使用可观察集合的绑定。现在,当我将项添加到新菜单项列表时,我似乎也遇到了一个问题,其中引发了一个异常:这种类型的CollectionView不支持从不同于Dispatcher线程的线程更改其SourceCollection。我将排除故障。