使用Event Aggregator和WIndowManager设计时间支持

时间:2015-10-05 09:43:08

标签: c# wpf design-time window-managers eventaggregator

我必须使用Caliburn.Micro 2.0.2为我的学士考试创建一个WPF应用程序。

在此应用程序中,三个不同的视图将显示在一个Shell(窗口)中,并且它们必须相互通信。所以我需要Event Aggregator。 我还需要窗口管理器来显示其他对话框。

我的实际问题是我必须将所有这些与完整的设计时支持结合在一起。 不幸的是,没有这种情况的例子。

Caliburn.Micro的文档说视图模型中需要一个默认构造函数,以提供设计时支持。但是,事件聚合器和窗口管理器在视图模型中用作构造函数参数,因此最初没有默认构造函数。

文档还说,在这种情况下,ViewModelLocator应该用于获得设计时支持。 不幸的是,关于ViewModelLocator的部分并没有给我足够的信息来说明如何做到这一点。

另一个想法可能是像这样链接构造函数:

public class ExampleViewModel : PropertyChangedBase
{
    private readonly IEventAggregator eventAggregator;
    private readonly IWindowManager windowManager;

    public ExampleViewModel() : this(null)
    {
    }

    public ExampleViewModel(IEventAggregator eventAggregator) : this(eventAggregator, null)
    {
    }

    public ExampleViewModel(IEventAggregator eventAggregator, IWindowManager windowManager)
    {
        this.eventAggregator = eventAggregator;
        this.windowManager = windowManager;

        // doing everything needed for the Design Time Support
    }
}

但我不知道这是否会起作用。

我希望有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

您可以使用单独的DataContext(ViewModel)来设计时间。您需要在使用视图模型的XAML中添加:

<UserControl 
    ...
    xmlns:dt="clr-namespace:YourProject.DesignTimeHelpers;assembly=YouAssembly"
    d:DataContext="{Binding Source={x:Static dt:DesignTimeModels.ExampleViewModelForDesignTime}}">

有一个带有视图模型的DesignTimeModels静态类:

public static class DesignTimeModels
{
    public static ExampleViewModel ExampleViewModelForDesignTime { get; set; }

    // static constructor
    static DesignTimeModels()
    {
        ExampleViewModelForDesignTime = 
            new ExampleViewModel(new EventAggregator(), new WindowManager());
    }
}

主要思想是通过带有您需要的参数的静态初始化程序创建视图模型的实例。

如果您希望IoC container(例如Caliburn)用于EventAggregatorWindowManager的即时播放,则可以使用ServiceLocator图案。例如:

// static constructor
static DesignTimeModels()
{
    var eventAggregator = ServiceLocator.Get<IEventAggregator>();
    var windowManager = ServiceLocator.Get<IWindowManager>();

    ExampleViewModelForDesignTime = 
        new ExampleViewModel(eventAggregator , windowManager);
}