WPF MVVM 从外部程序集加载视图和视图模型
本文关键字:视图 模型 加载 程序集 MVVM 从外部 WPF | 更新日期: 2023-09-27 18:33:53
所以我继承了使用Caliburn.Micro的WPF应用程序的开发。 我的任务是扩展应用程序并包含一些AddIn功能,我已经编写了AddIn功能的核心逻辑,在我运行应用程序并且shell视图通知我它"找不到TestViewModel的视图"之前,这些功能都运行良好
这是我在引导程序中的配置方法
protected override void Configure()
{
this._log.Debug("-->AppBootstrapper.Configure[ENTER]");
try
{
SplashScreenForm.SplashScreen.Dispatcher.BeginInvoke(
(Action)(() => SplashScreenForm.SplashScreen.Message = "Initializing Container..."));
this._container = new CompositionContainer(new AggregateCatalog(new DirectoryCatalog(".", "*")));
var batch = new CompositionBatch();
SplashScreenForm.SplashScreen.Dispatcher.BeginInvoke(
(Action)(() => SplashScreenForm.SplashScreen.Message = "Initializing Dependencies..."));
batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(new EventAggregator());
batch.AddExportedValue(this._container);
this._container.Compose(batch);
}
catch (Exception ex)
{
this._log.ErrorFormat("-->AppBootstrapper.Configure - {0}'n{1}", ex.Message, ex);
throw new Exception(ex.Message, ex);
}
this._log.Debug("-->AppBootstrapper.Configure[EXIT]");
}
然后我有两个程序集,AppMain,它包含主应用程序逻辑(这有一个ViewModels和Views文件夹,这些文件夹都可以正常加载),我还有一个AppAddinTest程序集,其中包含一个测试插件,这也包含一个ViewModels和Views文件夹。
我的测试视图模型代码是:
[Export(typeof(TestViewModel))]
public class TestViewModel : BaseViewModel, ITestViewModel
{
private readonly IEventAggregator _eventAggregator;
private readonly IWindowManager _windowManager;
[ImportingConstructor]
public TestViewModel(IEventAggregator eventAggregator, IWindowManager windowManager)
{
this._eventAggregator = eventAggregator;
this._windowManager = windowManager;
}
}
TestView.xaml是:
<UserControl x:Class="Cleo.Windows.Ui.Views.TestView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBlock Text="This is a test view from a different assembly!!"></TextBlock>
</Grid>
</UserControl>
任何人都可以阐明我做错了什么以及为什么应用程序找不到视图?
我敢打赌,您还没有在 ViewModel 所在的引导阶段添加程序集。覆盖引导程序中的SelectAssemblies()
:
protected override IEnumerable<Assembly> SelectAssemblies() {
var assemblies = new List<Assembly> {
//AddTheAssemblyWhereViewModelsReside
};
return assemblies;
}