【问题标题】:WPF - Datagrid get new item AFTER editingWPF - Datagrid在编辑后获取新项目
【发布时间】:2016-12-30 02:42:48
【问题描述】:

我有点卡在 WPF 数据网格的问题上,我的 google foo 又一次让我失望了,我想做的事情看起来很简单,但我一辈子都无法解决。

请记住,我在此应用程序中使用的是 Caliburn Micro

我有一个数据网格,它绑定到 ObservableCollection<Item> 项目本身使用 NotifyOfPropertyChangeIsDirty 标志处理更改,因此编辑这些项目不是问题,但是我无法工作为了弄清楚如何处理添加的新项目,我们使用数据网格的 CanUserEditRows 属性来允许内联添加新项目。

但是,当我尝试检测添加的新项目时,我的问题出现了,为了将其触发到我的数据库服务,似乎很多人使用 ObservableCollectionCollectionChanged 事件来检测这一点,然而,这似乎会在用户点击数据网格的{NewItemPlaceholder} 部分时触发,在插入任何数据之前。

private void ItemList_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.NewItems != null)
    {
        foreach (Item i in e.NewItems)
        {
            _itemManager.Insert(i);
        }
    }
}

这是我正在使用的代码,也许我犯了一个错误,但我似乎无法弄清楚如何在编辑完成后才触发它,不幸的是,谷歌似乎返回了相同的结果没有不管我如何尝试改写我的问题。希望这里有人可以为我提供一个相对简单的答案。

如果您需要更多代码来向您展示事情是如何工作的(例如 _itemManager),如果需要,我可以提供。

【问题讨论】:

    标签: c# wpf datagrid caliburn.micro


    【解决方案1】:

    很简单:

    // instances of this type user should edit in data grid
    public class Item : IEditableObject
    {
        // the item identifier
        public int Id { get; set; }
    
        // some data-bound properties
    
        #region IEditableObject Members
    
        public void BeginEdit()
        {            
        }
    
        public void CancelEdit()
        {
        }
    
        public void EndEdit()
        {
            // new items has identifier, set to 0
            if (Id == 0)
            {
                // post changes here
            }
        }
    
        #endregion
    }
    

    DataGrid知道IEditableObject,如果绑定的数据项实现了这个接口,grid在编辑时会调用相应的方法。

    【讨论】:

    • 编辑项目不是我的问题,编辑工作正常,它能够判断何时使用数据网格本身上的 {NewItemPlaceholder} 将新项目添加到数据网格,您的解决方案不会触发在每次编辑时,无论项目是否是新的?
    • “添加新项目时” - 这很简单,因为您应该有一个“新项目”的标准。更新了答案。
    • 感谢您的回复,这是有道理的,但是我有一个简单的问题,CRUD 函数由我的视图模型中的 _itemManager 处理,现在我正在考虑在我的对象上设置一个 IsNew 属性并执行检查我在保存时使用 IsDirty 的相同方式。但是我想知道是否有一种更简洁的方法,在保存数据时必须同时检查每个项目的 isnew 和 isdirty。
    • 您是在编辑后立即保存项目,还是使用批量更新一次保存多个项目?
    • 就个人而言,我更喜欢使用枚举的方法,例如 ItemState (New, Dirty, Unchanged) 和可编辑项中的单个状态属性,而不是 IsNewIsDirty .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多