我正在尝试通过使用CanUserAddRows="True"
在WPF datagrid allow user to add rows?和WPF DataGrid: Blank Row Missing
等多个问题中也回答了同样的问题。这两个问题的答案中提到的关键点之一是
确保ObeservableCollection中的对象具有默认值 无参数构造函数。
但这是我遇到问题的地方。因此定义了我绑定的集合:
public ObservableCollection<IDataItem> ItemList { get; }
当然,我无法定义无参数构造函数,因为我绑定了一个接口。那我该怎么做呢?
我知道如果绑定到具体对象的集合,那么它一切正常。
FWIW我试图通过UnityContainer
使用IOC(第一次),因此欢迎使用Resolve<IDataItem>()
的任何答案。
最终代码
我接受了约翰的回答,并通过为UnityContainer创建一个单独的工厂来实现我自己的IOC容器创意。这导致代码看起来像(使用Johan的代码)
void RegisterTypes()
{
IUnityContainer container = UnityFactory.Instance.Container;
container.RegisterType<IDataItem, DataItem >(new InjectionConstructor());
}
..
private readonly BindingList<IDataItem> _itemList = new BindingList<IDataItem>();
public ViewModel()
{
_itemList.AllowNew = true;
IUnityContainer container = UnityFactory.Instance.Container;
_itemList.AddingNew += (sender, e) => { e.NewObject = container.Resolve<IDataItem>(); };
}
public BindingList<IDataItem> ItemList
{
get { return _itemList; }
}
答案 0 :(得分:3)
This answer has what you want即:
private readonly BindingList<IDataItem> _itemList = new BindingList<IDataItem>();
public ViewModel()
{
_itemList.AllowNew = true;
_itemList.AddingNew += (sender, e) => e.NewObject = new DataItem(...);
// I don't think you want to show your IoC here
}
public BindingList<IDataItem> ItemList
{
get { return _itemList; }
}