【问题标题】:Injection and parameterless constructor in WPFWPF中的注入和无参数构造函数
【发布时间】:2015-07-19 15:58:30
【问题描述】:

我在 WPF 中有用于用户控制的代码(如下)。我使用 nInject 作为 IocContainer。我在 App 类的 OnStartup 事件中初始化 ioc。

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        var iocContainer = IocContainer.Get();

        iocContainer.Bind<CreateRemindPopup>().To<CreateRemindPopup>();
        iocContainer.Bind<MainWindow>().To<MainWindow>();

        Current.MainWindow = iocContainer.Get<MainWindow>();
        Current.MainWindow.Show();
    }

如果我删除无参数构造函数,我会在应该显示控件时得到异常 NullReferenceException。当存在无参数构造函数时,不执行显示内容的代码。

我的问题是如何强制 WPF 执行带参数的构造函数? 我不想删除无参数构造函数,因为那时我在 VisualStudio 中失去了设计师。

public partial class RemindersListing : UserControl
{
    private readonly IReminderReadLogic _reminderReadLogic;

    public ObservableCollection<Reminder> Reminders { get; set; }

    public RemindersListing()
    {
    }

    public RemindersListing(IReminderReadLogic reminderReadLogic)
    {
        _reminderReadLogic = reminderReadLogic;
        InitializeComponent();

        var list = _reminderReadLogic.Get();
        Reminders = new ObservableCollection<Reminder>(list);
    }
}

【问题讨论】:

  • 要强制它在你的代码中使用,你应该传递一个参数而不是调用new RemaindersListing();(这是无参数的)。你试过用这个吗?
  • 您好,创建对象是WPF内部的事情。我在 xaml 代码中声明了控制,所以我没有机会直接调用构造函数(至少我不知道)
  • @GrantWinney 我更新了我的帖子

标签: c# .net wpf dependency-injection ninject


【解决方案1】:

如何将默认构造函数转为私有,以便 wpf 调用它并添加带有您希望的参数的构造函数:

private RemindersListing()
{
    InitializeComponent();
}

public RemindersListing(IReminderReadLogic reminderReadLogic) : this()
{
    ...

}

或者考虑使用本文中的 DependencyProperty:

http://www.informit.com/articles/article.aspx?p=2115888&seqNum=3

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2018-01-29
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2010-12-29
    相关资源
    最近更新 更多