【问题标题】:WPF DataGrid How to add a blank row when binding to an interfaceWPF DataGrid如何在绑定到接口时添加空白行
【发布时间】:2014-10-14 11:30:58
【问题描述】:

我正在尝试通过使用CanUserAddRows="True" 来设置一个 DataGrid 在末尾有一个空白行

WPF datagrid allow user to add rows?WPF DataGrid: Blank Row Missing 等多个其他问题也回答了同样的问题

这两个问题的答案中提到的关键点之一是

确保 ObeservableCollection 中的对象具有默认值 无参数构造函数。

但这是我有问题的地方。我绑定的集合是这样定义的:

public ObservableCollection<IDataItem> ItemList { get; }

所以我当然不能定义无参数构造函数,因为我绑定到一个接口。那么我该怎么做呢?

我知道,如果绑定到具体对象的集合,那么一切正常。

FWIW 我正在尝试通过UnityContainer 使用 IOC(第一次),因此欢迎通过Resolve&lt;IDataItem&gt;() 提供任何答案。

最终代码

我接受了 Johan 的回答,并通过为 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; }
}

【问题讨论】:

    标签: wpf datagrid interface


    【解决方案1】:

    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; }
        }
    

    【讨论】:

    • 这正是我想要的!另请参阅我对 IOC 容器放置位置的编辑。