使用 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 中的任何值时,更改不会投射到设计器中,并且在您 运行 应用程序最后一旦设计器抛出错误(图像)并停止渲染,但一切在 运行 时间工作。
图片
如何复制
- 克隆 problem example 存储库
- 打开解决方案
- 在设计器中打开 Views/ShellView.xaml
- 此时设计器应该工作正常并在 StackPanel 中显示 3 个项目
- 打开ViewModels/ShellViewModel.cs
- 对源数组进行任何更改(更改名称、删除或添加项目)
- 运行 应用程序,您应该会看到所做的更改
- 返回 Views/ShellView 的设计器。xaml
- 设计器将在第 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()
);
}
背景
我正在使用 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 中的任何值时,更改不会投射到设计器中,并且在您 运行 应用程序最后一旦设计器抛出错误(图像)并停止渲染,但一切在 运行 时间工作。
图片
如何复制
- 克隆 problem example 存储库
- 打开解决方案
- 在设计器中打开 Views/ShellView.xaml
- 此时设计器应该工作正常并在 StackPanel 中显示 3 个项目
- 打开ViewModels/ShellViewModel.cs
- 对源数组进行任何更改(更改名称、删除或添加项目)
- 运行 应用程序,您应该会看到所做的更改
- 返回 Views/ShellView 的设计器。xaml
- 设计器将在第 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()
);
}