使用 Caliburn.Micro 时,AutoMapper 在设计时不起作用

AutoMapper doesn't work at design time when using Caliburn.Micro

背景

我正在使用 WPF 和 Caliburn.Micro 为现有的 CLI 应用程序构建用户界面。因为我提供了一堆 DTO 对象,所以我使用 AutoMapper 将数据传递给支持 PropertyChanged 通知的模型(使用 Caliburn.Micro 中的 PropertyChangedBase)。

我在 Bootstrapper#Configure 方法中设置 AutoMapper,如下所示:

Mapper.Initialize(
    config => config.CreateMap<ModelA, ModelB>()
);

我在 ViewModel:

中这样使用它
private static ModelA[] source = new[] {
    new ModelA {
        Name = "foo"
    },
    new ModelA {
        Name = "bar"
    }
};

public BindableCollection<ModelB> Items { get; } = new BindableCollection<ModelB>(
    Mapper.Map<ModelA[], IEnumerable<ModelB>>(source)
);

问题描述

问题是当我为 Caliburn.Micro 使用 Design Time support 时,DataMapper 仅在您启动 Visual Studio.

时工作
xmlns:vm="clr-namespace:CaliburnAutoMapperBug.ViewModels"
xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro.Platform"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance Type=vm:ShellViewModel, IsDesignTimeCreatable=True}"
cal:Bind.AtDesignTime="True">

当您更改 ViewModel 中的任何值时,更改不会投射到设计器中,并且在您 运行 应用程序最后一旦设计器抛出错误(图像)并停止渲染,但一切在 运行 时间工作。

图片

如何复制

  1. 克隆 problem example 存储库
  2. 打开解决方案
  3. 在设计器中打开 Views/ShellView.xaml
  4. 此时设计器应该工作正常并在 StackPanel 中显示 3 个项目
  5. 打开ViewModels/ShellViewModel.cs
  6. 对源数组进行任何更改(更改名称、删除或添加项目)
  7. 运行 应用程序,您应该会看到所做的更改
  8. 返回 Views/ShellView 的设计器。xaml
  9. 设计器将在第 10 行显示错误:"Unmapped members were found..."

我还没有完全解决设计时的问题,但是切换到基于实例的 AutoMapper 配置 解决了异常。

protected override void Configure() {
    container = new SimpleContainer();
    container.Singleton<IWindowManager, WindowManager>();
    container.Singleton<IEventAggregator, EventAggregator>();
    container.PerRequest<IShell, ShellViewModel>();

    MapperConfiguration config = new MapperConfiguration(cfg => {
        cfg.CreateMap<Core.ProjectDto, Models.Panel.Project>();
    });

    container.RegisterInstance(
        typeof(IMapper),
        "automapper",
        config.CreateMapper()
    );
}