【问题标题】:Caliburn.Micro WPF: How can I create a new ViewModel that has a dependency?Caliburn.Micro WPF:如何创建具有依赖关系的新 ViewModel?
【发布时间】:2018-05-28 10:04:29
【问题描述】:

我创建了一个名为 ShellView 的窗口,它将加载或处理两个名为 AViewBView 的用户控件。

我已经有了这个设置:

Bootstrapper.cs

public class Bootstrapper : BootstrapperBase
{
    private SimpleContainer _container = new SimpleContainer();

    public Bootstrapper()
    {
        Initialize();
    }

    protected override void OnStartup(object sender, StartupEventArgs e)
    {
        base.OnStartup(sender, e);
        DisplayRootViewFor<ShellViewModel>();
    }

    protected override void Configure()
    {
        _container.Singleton<IWindowManager, WindowManager>();
        _container.Singleton<IEventAggregator, EventAggregator>();
        _container.RegisterPerRequest(typeof(ShellViewModel), null, typeof(ShellViewModel));
    }

    protected override object GetInstance(Type serviceType, string key)
    {
        return _container.GetInstance(serviceType, key);
    }

    protected override IEnumerable<object> GetAllInstances(Type serviceType)
    {
        return _container.GetAllInstances(serviceType);
    }

    protected override void BuildUp(object instance)
    {
        _container.BuildUp(instance);
    }
}

AViewModel.cs

public class AViewModel : Screen
{
    private IEventAggregator _eventAggregator;

    public AViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator.
    }
}

这就是问题所在,如何在 ShellViewModel 中传递事件聚合器的实例?

ShellView.cs

public class ShellViewModel : Conductor<Screen>
{
    public ShellViewModel()
    {
        // Should I create an instance and pass it in? If not, how?
        ActivateItem(new AViewModel(?));
    }
}

【问题讨论】:

    标签: c# wpf mvvm caliburn.micro


    【解决方案1】:

    Caliburn.Micro 为此有一个名为IoC 的静态类。你应该这样做:

    ActivateItem(IoC.Get<AViewModel>());
    

    如果有意义的话,您也可以这样做:

    public class ShellViewModel : Conductor<Screen>
    {
        private IEventAggregator _eventAggregator;
    
        public ShellViewModel(IEventAggregator eventAggregator)
        {
            _eventAggregator = eventAggregator;
            ActivateItem(new AViewModel(_eventAggregator));
        }
    }
    

    【讨论】:

    • 不幸的是,第一个解决方案对我不起作用。幸运的是,您提供了两种解决方案,所以我使用了第二种可行的解决方案。非常感谢!
    猜你喜欢
    • 2011-12-31
    • 2021-11-01
    • 1970-01-01
    • 2016-07-31
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2014-09-06
    相关资源
    最近更新 更多