C# Class 具有名称和任何对象类型的集合
C# Class that has a name and a Collection of any object type
我正在尝试创建一个菜单列表,用户可以从 TreeView select。 select 从树中选择一个菜单后,我想在 window 的单独部分中显示该菜单中的项目。我首先想到的方法是创建一个如下所示的 class:
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);
}
}
其中 "Items" 是菜单中的项目。然后,我会为系统中的每个菜单创建一个 class 的新实例,并使用名称和项目的 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>'
我想使用一个 "Menu" class 以便我可以在 UI 中以一致的方式使用它进行显示和交互。有没有办法让一个 master class 可以包含任何类型的 ObservableCollection?
正如 Ed Plunkett 的评论中所述,您可以将所需的功能抽象为通用接口或基础 class:
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);
}
}
在此示例中,Items 公开为 IEnumerable - 如果您需要访问 ObservableCollection 以绑定到其事件,您可能需要一个 init 方法到接口,该方法接受要绑定的控件作为参数.
我正在尝试创建一个菜单列表,用户可以从 TreeView select。 select 从树中选择一个菜单后,我想在 window 的单独部分中显示该菜单中的项目。我首先想到的方法是创建一个如下所示的 class:
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);
}
}
其中 "Items" 是菜单中的项目。然后,我会为系统中的每个菜单创建一个 class 的新实例,并使用名称和项目的 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>'
我想使用一个 "Menu" class 以便我可以在 UI 中以一致的方式使用它进行显示和交互。有没有办法让一个 master class 可以包含任何类型的 ObservableCollection?
正如 Ed Plunkett 的评论中所述,您可以将所需的功能抽象为通用接口或基础 class:
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);
}
}
在此示例中,Items 公开为 IEnumerable - 如果您需要访问 ObservableCollection