在此先感謝您花時間閱讀本文的人!沒有匹配的綁定可用,並且類型在使用Lazy時不可自行綁定。<T>
我正在嘗試使用Ninject來解析名爲CategoryListBox和SubCategoryListBox的一對級聯列表框中包含的項,然後Lazy在單擊SubCategoryListBox項時加載窗體。
我有以下接口:
public interface ICategory
{
string Caption { get; set; }
ISubCategory[] SubCategories { get; set; }
}
public interface ISubCategory
{
string Caption { get; set; }
Lazy<ISubForm> SubForm { get; set; }
}
public interface ISubForm
{
void Show();
}
我有以下「基地」類實現的接口:
public class BaseCategory : ICategory
{
public string Caption { get; set; }
public ISubCategory[] SubCategories { get; set; }
public BaseCategory(string caption, ISubCategory[] subCategories)
{
Caption = caption;
SubCategories = subCategories;
}
}
public class BaseSubCategory : ISubCategory
{
public string Caption { get; set; }
public Lazy<ISubForm> SubForm { get; set; }
public BaseSubCategory(string caption, Lazy<ISubForm> subForm)
{
Caption = caption;
SubForm = subForm;
}
}
我有4個「混凝土」的形式來實現ISubForm接口如下:
public partial class SubForm1A : Form, ISubForm {}
public partial class SubForm1B : Form, ISubForm {}
public partial class SubForm2A : Form, ISubForm {}
public partial class SubForm2B : Form, ISubForm {}
我通過NuG引用了Ninject和Ninject.Extensions.Factory等我usings看起來像這樣
using Ninject;
using Ninject.Extensions.Factory;
我綁定聲明是這樣的:
IKernel kernel = new StandardKernel();
kernel.Bind<ICategory>().To<BaseCategory>().Named("Category 1").WithConstructorArgument("One");
kernel.Bind<ISubCategory>().To<BaseSubCategory>().WhenParentNamed("Category 1").Named("SubCategory 1A").WithConstructorArgument("1A");
kernel.Bind<ISubCategory>().To<BaseSubCategory>().WhenParentNamed("Category 1").Named("SubCategory 1B").WithConstructorArgument("1B");
kernel.Bind<ISubForm>().To<SubForm1A>().WhenParentNamed("SubCategory 1A");
kernel.Bind<ISubForm>().To<SubForm1B>().WhenParentNamed("SubCategory 1B");
kernel.Bind<ICategory>().To<BaseCategory>().Named("Category 2").WithConstructorArgument("Two");
kernel.Bind<ISubCategory>().To<BaseSubCategory>().WhenParentNamed("Category 2").Named("SubCategory 2A").WithConstructorArgument("2A");
kernel.Bind<ISubCategory>().To<BaseSubCategory>().WhenParentNamed("Category 2").Named("SubCategory 2B").WithConstructorArgument("2B");
kernel.Bind<ISubForm>().To<SubForm2A>().WhenParentNamed("SubCategory 2A");
kernel.Bind<ISubForm>().To<SubForm2B>().WhenParentNamed("SubCategory 2B");
我填充CategoryListBox數據源如下:
List<ICategory> categories = kernel.GetAll<ICategory>().ToList<ICategory>();
CategoryListBox.DataSource = categories;
CategoryListBox.DisplayMember = "Caption";
當您雙擊該項目在CategoryListBox中它填充SubCategoryListBox如下:
private void CategoryListBox_MouseDoubleClick(object sender, MouseEventArgs e)
{
ICategory selected = (ICategory)((ListBox)sender).SelectedItem;
SubCategoryListBox.DataSource = selected.SubCategories;
SubCategoryListBox.DisplayMember = "Caption";
}
在SubCategoryListBox當您雙擊該項目我試圖延遲加載子窗體,這是當我碰上了「無匹配的綁定是用」錯誤
private void SubCategoryListBox_MouseDoubleClick(object sender, MouseEventArgs e)
{
ISubCategory selected = (ISubCategory)((ListBox)sender).SelectedItem;
selected.SubForm.Value.Show();
}
我的目標是不實例化SubForms直到我點擊SubCategoryListBox。
我相當肯定我會以錯誤的方式去解決問題,並歡迎任何建議。