【发布时间】:2015-04-14 11:48:18
【问题描述】:
我有一个 WPF 应用程序,使用 Caliburn Micro 和用于 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 声望,所以我无法发布我的屏幕截图。
【问题讨论】:
-
您是否已经为设计时进行了任何设置?代码 sn-p 有帮助。 caliburnmicro.com/documentation/design-time
-
您能否在您的引导程序中添加对 StartDesignTime 的显式调用,看看它是否因异常而失败。
-
我在我的 Bootstrapper 构造函数中添加了对 StartDesignTime 的调用 - 没有设计时更改 - 异常仍然发生,并且在运行时没有异常。
-
我有类似的问题,我注意到当 ContentControl 尝试显示普通的
string对象时会发生这种情况。当它试图显示一个复杂的对象时,通常会显示cannot find view for XYZ。但是对于string,要么是这次崩溃,要么很少是cannot find view for string。 -
我也遇到了这个问题。这是由于
Configure中的自定义引导程序中的异常所致。由于Configure抛出异常,IoC从未初始化。如果StartDesignTime函数中有异常,那么 IoC 可能无法正常工作。您最终从另一个实例调试 XAML 设计器XDesProc以查找异常。
标签: wpf caliburn.micro