我正在开发一个WPF应用程序,它将dll中的模块作为延迟屏幕加载到TransitionContentControl中。遵循标准命名约定时,正确显示模块中Viewmodel的视图。但是,我有两个问题:
1)模块本身使用外部“小部件”,屏幕包含从另一个dll加载的视图。
[ImportMany(typeof(IWidget), AllowRecomposition = true)]
public IEnumerable<ExportFactory<IWidget, IWidgetMetadata>> _widgets { get; set; }
<ContentControl x:Name="Navigator" cal:View.Model="{Binding Navigator}"/>
调用属性“Navigator”,在第一个实例中没有找到视图。但随后它被第二次调用并且检测到视图,因为我可以看到窗口小部件视图模型有一个视图附加(OnViewAttached调用)给它们(ViewAware类),View本身也有ViewModel作为其DataContext。但是,它们最后没有显示出来;我也认识到永远不会调用“OnViewLoaded”,而是视图“找不到视图......”。问题在哪里?
我使用了类似的原型应用程序并添加了产生问题的Widgets项目,但Navigator属性在此处只调用一次。输出是相同的,但没有找到视图。
2)另一个问题是“cal:View.Context”似乎在模块中不起作用,因此View文件夹中的子文件夹似乎无法解析。
/帕特里克
答案 0 :(得分:1)
CM正在使用其AssemblySource
注册表来查找匹配的候选视图。默认情况下,它包含所有类型的启动程序集。
在你的情况下,程序集是松散耦合和动态加载的,CM很可能找不到它们。
加载程序集后立即尝试AssemblySource.Instance.Add(yourAssembly);
,这样可以解决您的问题。
BTW:为什么在示例中使用基于约定的和显式CM ViewModel绑定?