我有一个使用Caliburn Micro的WPF应用程序和DI的StructureMap。
在我的窗口上,我有一个ContentControl,其名称是我视图模型的属性 - 在运行时,Caliburn根据此属性的类型成功找到正确的视图,并将其显示在该区域中。
但在设计时,会抛出异常:“InvalidOperationException:IoC未初始化。”。查看堆栈跟踪,显然Caliburns ViewLocator正在尝试使用IoC来创建视图实例,但IoC容器在设计时未初始化。
所以,问题是:你如何在设计时初始化Caliburn的IoC?
修改
这是我的UserControl声明:
<UserControl x:Class="MyNamespace.Views.Checklist.ChecklistQuestionEditView"
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"
xmlns:vm="clr-namespace:MyNamespace.ViewModels.Checklist"
xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro.Platform"
d:DataContext="{d:DesignInstance Type=vm:ChecklistQuestionEditDesignerViewModel, IsDesignTimeCreatable=True}"
cal:Bind.AtDesignTime="True"
d:DesignHeight="700" d:DesignWidth="1000">
以下是导致问题的ContentControl:
<ContentControl IsTabStop="False" Grid.Row="2" Grid.Column="0" Margin="12" Name="TranslationView"/>
此控件由Caliburn的名称约定通过视图模型中的此属性填充:
private ChecklistQuestionTranslationViewModel _TranslationView;
public ChecklistQuestionTranslationViewModel TranslationView
{
get { return _TranslationView; }
set
{
if (_TranslationView != value)
{
_TranslationView = value;
NotifyOfPropertyChange(() => TranslationView);
}
}
}
如果我从XAML中删除上面的ContentControl行,则所有其他设计器功能都按预期工作。
出于某种原因,你无法从设计师那里复制异常消息,所以我在这里放一个屏幕截图。您可以看到Caliburn正在尝试使用IoC来创建View的实例。但我没有10个声誉,因此我无法发布我的屏幕截图。
答案 0 :(得分:2)
你可能想看看this SO thread我最近问过(并回答):到目前为止我们工作得很好。
该方法的要点是:
为每个视图模型准备假设计时版本,包括容器/ 父以及映射到{{ 1}你的观点(孩子)。
每个设计时版本都有空构造函数,不需要设置外部依赖项。必须不依赖DI / IoC容器。
对于视图和原始视图模型之间数据绑定的每个公共属性,设计时视图模型应具有同名的属性... 不一定相同类型。
ContentControl
的属性,而伪父视图模型的类型为MyCommandBarViewModel
。这可能适用于视图模型的整个可视树,叶子是仅显示简单属性类型(字符串,数字等)的视图模型
为了让Designer和Caliburn.Micro一起工作以生成那些设计时版本,您需要在根UI元素(Window,UserControl,...)上添加以下内容:
MyDesignTimeCommandBarViewModel