Caliburn Micro - IoC未在WPF设计器中初始化

时间:2015-02-13 12:22:27

标签: wpf caliburn.micro

我有一个使用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个声誉,因此我无法发布我的屏幕截图。

1 个答案:

答案 0 :(得分:2)

你可能想看看this SO thread我最近问过(并回答):到目前为止我们工作得很好。

该方法的要点是:

  1. 为每个视图模型准备设计时版本,包括容器/ 以及映射到{{ 1}你的观点(孩子)。

  2. 每个设计时版本都有空构造函数,不需要设置外部依赖项。必须依赖DI / IoC容器。

  3. 对于视图和原始视图模型之间数据绑定的每个公共属性,设计时视图模型应具有同名的属性... 不一定相同类型。

    • 这是您的子视图模型映射到ContentControl的情况:真正的父视图模型具有例如:类型为ContentControl的属性,而伪父视图模型的类型为MyCommandBarViewModel
  4. 这可能适用于视图模型的整个可视树,叶子是仅显示简单属性类型(字符串,数字等)的视图模型

  5. 为了让Designer和Caliburn.Micro一起工作以生成那些设计时版本,您需要在根UI元素(Window,UserControl,...)上添加以下内容:

    MyDesignTimeCommandBarViewModel