我想将(导入MEF2公约)IEnumerable<Lazy<IModule>>
集合绑定到菜单。
IModule是位于外部项目中的ViewModels的接口。
我的问题是,在使用Lazy<T>
的情况下,我无法弄清楚如何在不实例化对象的情况下获取MenuName(及其所属的MenuParent,如果有的话)的方法,这违背了惰性初始化的目的(存在有很多模块,每个用户都需要使用很少的模块)。我将Caliburn.Micro用于MVVM。
我曾考虑过将Menu结构存储在数据库中,但这会增加其他开发人员创建新模块或删除过时模块时的失败点,类似于硬编码菜单。
MEF导出:
RegistrationBuilder builder = new RegistrationBuilder()
builder.ForTypesDerivedFrom<IModule>.Export<IModule>
MenuViewModel:
private IEnumerable<Lazy<IModule>> _modules;
public MenuViewModel(IEnumerable<Lazy<IModule>> modules)
{
_modules = modules;
}
public IEnumerable<Lazy<IModule>> Modules
{
get { return _modules; }
set { _modules = value; }
}
我在这里停了下来,因为没有要绑定的内容。 Lazy<IModule>
不包含任何与绑定类型有关的信息。
我正在寻找一种策略,以允许MEF导出第三方插件,而我的名字可以显示在菜单上,而无需对菜单进行硬编码。
答案 0 :(得分:1)
Value
的{{1}}属性将初始化并返回一个Lazy<IModule>
,但是当然您需要实例化它们以便能够从中获取任何信息。
您可以绑定到某些轻量级视图模型对象,而不是使用IModule
。这意味着您将必须为每个模块创建其他类型,但是鉴于您的要求,这不应该成为问题。