使用caliburn micro和autofac填充初始视图模型数据

时间:2013-03-01 19:28:03

标签: c# wpf mvvm autofac caliburn

我正在同时学习Caliburn.Micro和Autofac。我正在写一个简单的应用程序,所以我可以自学如何正确使用这两种技术。

每次我想我到达某个地方时,我总是被绊倒如何为我的根视图模型初始化我的数据。此视图模型需要注入“类别”视图模型列表。此应用程序初始化期间将加载此“类别”视图模型列表。

那么,如何使用autofac注册我的根“Navigator”视图模型并通知autofac视图模型在创建新实例时需要注入数据?

如果没有caliburn和autofac,我只需创建自己的启动方法,加载我的数据,然后将其注入我的viewmodel。使用caliburn,我试图覆盖引导程序中的configure方法,因为这是我应该用ioc容器注册我的类。

我的根视图模型:

public class NavigatorViewModel : Conductor<IScreen>.Collection.OneActive
{
    public NavigatorViewModel(IEnumerable<CategoryViewModel> categories)
    {
        AddCategories(categories);
    }

    public void AddCategories(IEnumerable<CategoryViewModel> categories)
    {
        foreach (var category in categories)
        {
            if (Items.Contains(category))
                continue;
            Items.Add(category);
        }
        SetActiveItem();
    }

    private void SetActiveItem()
    {
        if (Items.Count < 1)
            return;
        ActiveItem = Items[0];
    }
}

以下是我使用Autofac注册viewModels的方法:

protected override void Configure()
{
    var builder = new ContainerBuilder();

    builder.RegisterType<CategoryViewModel>().AsSelf();
    builder.RegisterType<NavigatorViewModel>().AsSelf();
    ...
    container = builder.Build();
}

注册NavigatorViewModel时如何告诉autofac它还需要注入CategoryViewModel列表?

我猜我会在caliburn bootstrapper中加载我的数据,但我只是不确定如何在这一点上将它全部挂起。

1 个答案:

答案 0 :(得分:0)

这看起来像是一个关于AutoFac而不是MVVM或Caliburn.Micro的问题,无论如何,据我所知,AutoFac会自动支持序列自动接线(IEnumberable),因此当它尝试时它应该自己填充所有列表解决您的导航器,但如果您需要为数据加载提供自定义工作,您可以这样做:

builder.RegisterType<NavigatorViewModel>()
.AsSelf()
.WithParameter(
(p, c) => true, 
(p, c) => new[] 
{ 
// Load your CategoryViewModels here or any other data that you would like
});

您可以在WithParameter方法上查看AutoFac documentation